SQL多表多字段比對(duì)方法實(shí)例代碼
表-表比較
整體思路
- 兩張表?xiàng)l數(shù)一樣
- 條數(shù)相同是前提,然后比較字段值才有意義
- 兩表字段值完全相同【兩表所有字段的值相同】
- 兩表所有字段union后,條數(shù)與另一張表?xiàng)l數(shù)一樣
- 兩表字段值部分相同【兩表部分字段的值相同】
- 原理:union有去重功能
- 兩表部分字段union后,條數(shù)與另一張的count(distinct 部分字段)一樣
- 找出不同字段的明細(xì)
找出不同字段的明細(xì)
T1/T2兩表ID相同的部分,是否存在不同NAME
SELECT T1.ID,T2.ID,T1.`NAME`,T2.`NAME` FROM A T1 LEFT JOIN B T2 ON T1.ID = T2.ID AND COALESCE(T1.ID,'') <> '' AND COALESCE(T2.ID,'') <> '' WHERE T1.`NAME` <> T2.`NAME`;
兩表的交集與差集:判斷兩表某些字段是否相同
判斷兩表某些字段是否相同,3種查詢(xún)結(jié)果相同
-- 寫(xiě)法01 SELECT COUNT(1) FROM ( SELECT DISTINCT ID,`NAME` FROM A ) T1; -- 寫(xiě)法02 SELECT COUNT(1) FROM ( SELECT DISTINCT ID,`NAME` FROM B ) T2; -- 寫(xiě)法03 SELECT COUNT(1) FROM ( SELECT DISTINCT ID,`NAME` FROM A UNION SELECT DISTINCT ID,`NAME` FROM B ) T0;
not in與exists
兩表的交集與差集:找出T2表獨(dú)有的id
找出只存在于T2,不在T1中的那些id
- 下面2種寫(xiě)法結(jié)果一樣
-- 寫(xiě)法01 SELECT T2.`NAME`,T2.* FROM A T2 WHERE T2.`NAME` IS NOT NULL AND NOT EXISTS (SELECT 1 FROM B T1 WHERE T1.ID = T2.ID); -- 寫(xiě)法02 SELECT T2.`NAME`,T2.* FROM A T2 WHERE T2.`NAME` IS NOT NULL AND T2.ID NOT IN (SELECT T1.ID FROM B T1 );
字段-字段比較
判斷兩個(gè)字段間一對(duì)多或多對(duì)一的關(guān)系
測(cè)試id與name的一對(duì)多關(guān)系以下SQL會(huì)報(bào)錯(cuò),報(bào)錯(cuò)原因 GROUP BY
SELECT ID,`NAME`,COUNT(*) FROM A GROUP BY ID HAVING COUNT(`NAME`)>1;
修改后:
SELECT ID, COUNT(DISTINCT `NAME`) FROM A GROUP BY ID HAVING COUNT(DISTINCT `NAME`)>1;
這樣就說(shuō)明id與name是一對(duì)多的關(guān)系
擴(kuò)展:多對(duì)多關(guān)系,上述SQL中id與name位置互換后,查詢(xún)有值,就說(shuō)明兩者是多對(duì)多關(guān)系
證明id字段不是主鍵
- 下面2種寫(xiě)法結(jié)果一樣
-- 寫(xiě)法01 SELECT ID FROM A GROUP BY ID HAVING COUNT(*)>1; -- 寫(xiě)法02 SELECT ID,COUNT(ID) FROM A GROUP BY ID HAVING COUNT(ID)>1;
證明id, name字段不是聯(lián)合主鍵
SELECT ID,`NAME` FROM A GROUP BY ID,`NAME` HAVING COUNT(*)>1 ORDER BY ID;
數(shù)據(jù)準(zhǔn)備
-- 建表
CREATE TABLE IF NOT EXISTS TEST01.A
(
ID VARCHAR(50) COMMENT 'ID號(hào)' -- 01
,NUMS INT COMMENT '數(shù)字' -- 02
,NAME VARCHAR(50) COMMENT '名字' -- 03
)
COMMENT 'A表'
STORED AS PARQUET
;
-- 插數(shù)
INSERT INTO TEST01.A (ID,NUMS,NAME) VALUES ('01',1,NULL);
INSERT INTO TEST01.A (ID,NUMS,NAME) VALUES ('02',2,'');
INSERT INTO TEST01.A (ID,NUMS,NAME) VALUES ('03',3,'c');
-- 刪數(shù)
DELETE FROM TEST01.A WHERE ID = '04';
-- 刪表
DROP TABLE IF EXISTS TEST01.A;總結(jié)
到此這篇關(guān)于SQL多表多字段比對(duì)方法的文章就介紹到這了,更多相關(guān)SQL多表多字段比對(duì)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL Slave 觸發(fā) oom-killer解決方法
這篇文章主要介紹了MySQL Slave 觸發(fā) oom-killer解決方法,需要的朋友可以參考下2016-07-07
Mysql查詢(xún)或?qū)С鼋Y(jié)果添加序號(hào)字段實(shí)現(xiàn)方法
這篇文章主要介紹了Mysql查詢(xún)或?qū)С鼋Y(jié)果添加序號(hào)字段實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04
Mysql事務(wù)并發(fā)臟讀+不可重復(fù)讀+幻讀詳解
這篇文章主要介紹了Mysql事務(wù)并發(fā)臟讀+不可重復(fù)讀+幻讀詳解,文章基于Mysql事務(wù)的相關(guān)資料展開(kāi)對(duì)主題的詳細(xì)介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-04-04
MySQL數(shù)據(jù)庫(kù)如何克隆(帶腳本)
這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)如何克隆(帶腳本)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03
MySQL表鎖定問(wèn)題的原因、檢測(cè)與解決方案
在數(shù)據(jù)庫(kù)管理系統(tǒng)中,鎖是保證數(shù)據(jù)一致性和事務(wù)隔離性的重要機(jī)制,然而,鎖的使用也可能導(dǎo)致性能問(wèn)題,尤其是在高并發(fā)場(chǎng)景下,表鎖定(Table Locking)可能會(huì)成為系統(tǒng)的瓶頸,本文將深入探討MySQL中表鎖定的原因、如何檢測(cè)表鎖定問(wèn)題,并提供有效的解決方案2025-01-01
MySQL MaxCompute與AnalyticDB實(shí)現(xiàn)數(shù)據(jù)處理與轉(zhuǎn)換過(guò)程詳解
AnalyticDB MySQL(簡(jiǎn)稱(chēng)ads)與 MaxCompute(簡(jiǎn)稱(chēng)odps)進(jìn)行數(shù)據(jù)轉(zhuǎn)換時(shí),個(gè)別語(yǔ)法有差別,記錄下來(lái),方便備查,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2022-12-12

