mysql - SQL識(shí)別兩張表不同數(shù)據(jù)
問(wèn)題描述
有兩張1W行左右的表,需要查詢有差異的行,現(xiàn)在的代碼如下:
SELECT number, versionFROM ( SELECT a.number, b.version FROM a UNION ALL SELECT b.number, b.version FROM b) tbGROUP BY number, versionHAVING COUNT(*) = 1ORDER BY number
但是問(wèn)題來(lái)了,以上代碼只能查詢出不同的行,但是沒(méi)法顯示a表中有的b表中沒(méi)有的,b表中有的a表中沒(méi)有的,有沒(méi)有辦法可以在第3列標(biāo)識(shí)出來(lái)?
問(wèn)題解答
回答1:按樓主意思,單表中number和version是不會(huì)重復(fù)的,兩張表的number和version建一個(gè)復(fù)合索引,然后執(zhí)行以下sql
SELECT a.number, a.version,’from_a’FROM awhere not exists (SELECT 1 FROM b where a.number=b.number and a.version=b.version)union allSELECT b.number, b.version,’from_b’FROM bwhere not exists (SELECT 1 FROM a where a.number=b.number and a.version=b.version)ORDER BY number;或者SELECT a.number, a.version,’from_a’from a left join b on a.number=b.number and a.version=b.versionwhere b.id is nullunion allSELECT b.number, b.version,’from_b’from a right join b on a.number=b.number and a.version=b.versionwhere a.id is nullORDER BY number;下面這個(gè)效率可能會(huì)差點(diǎn)回答2:
試試full join ... where a is null or b is null。比如用Postgres:
select case when a.n is null then b.n else a.n end as n, case when a.n is null then b.v else a.v end as v, case when a.n is null then ’b’ else ’a’ end as srcfrom (values(1, 2), (2, 3), (3, 4)) as a(n, v) full join (values(6, 7), (2, 3), (3, 9)) as b(n, v) using (n, v)where a.n is null or b.n is null
結(jié)果:
n | v | src---+---+----- 1 | 2 | a 3 | 4 | a 3 | 9 | b 6 | 7 | b(4 行記錄)
相關(guān)文章:
1. javascript - JS設(shè)置Video視頻對(duì)象的currentTime時(shí)出現(xiàn)了問(wèn)題,IE,Edge,火狐,都可以設(shè)置,反而chrom卻...2. java固定鍵值轉(zhuǎn)換,使用枚舉實(shí)現(xiàn)字典?3. css - ionic中的柵格布局如何讓文字內(nèi)容多少不同的每一列中的內(nèi)容都能垂直居中?4. java - 我設(shè)置了cookie的max age,但是cookie依然在關(guān)閉游覽器后消失了5. 如何為每個(gè)應(yīng)用程序配置tomcat 6的logs / catalina.out。(為sys.out,sys.err配置Web應(yīng)用程序特定的日志文件)6. php自學(xué)從哪里開(kāi)始?7. phpstady在win10上運(yùn)行8. 求大神幫我看看是哪里寫(xiě)錯(cuò)了 感謝細(xì)心解答9. Python, for-else, while-else是否造成了語(yǔ)義歧義 ( 增加心智負(fù)擔(dān) )?10. 這是什么情況???
