mysql - SQL識(shí)別兩張表不同數(shù)據(jù)
問(wèn)題描述
有兩張1W行左右的表,需要查詢(xún)有差異的行,現(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)了,以上代碼只能查詢(xún)出不同的行,但是沒(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. android - NavigationView 的側(cè)滑菜單中如何保存新增項(xiàng)(通過(guò)程序添加)2. jquery清除input type為password?3. 提示語(yǔ)法錯(cuò)誤語(yǔ)法錯(cuò)誤: unexpected ’abstract’ (T_ABSTRACT)4. tp5 不同控制器中的變量調(diào)用問(wèn)題5. 這段代碼既不提示錯(cuò)誤也看不到結(jié)果,請(qǐng)老師明示錯(cuò)在哪里,謝謝!6. php - 第三方支付平臺(tái)在很短時(shí)間內(nèi)多次異步通知,訂單多次確認(rèn)收款7. php7.3.4中怎么開(kāi)啟pdo驅(qū)動(dòng)8. ueditor上傳服務(wù)器提示后端配置項(xiàng)沒(méi)有正常加載,求助!!!!!9. mysql服務(wù)無(wú)法啟動(dòng)1067錯(cuò)誤,誰(shuí)知道正確的解決方法?10. 老師 我是一個(gè)沒(méi)有學(xué)過(guò)php語(yǔ)言的準(zhǔn)畢業(yè)生 我希望您能幫我一下
