mysql - SQL識別兩張表不同數(shù)據(jù)
問題描述
有兩張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
但是問題來了,以上代碼只能查詢出不同的行,但是沒法顯示a表中有的b表中沒有的,b表中有的a表中沒有的,有沒有辦法可以在第3列標(biāo)識出來?
問題解答
回答1:按樓主意思,單表中number和version是不會重復(fù)的,兩張表的number和version建一個復(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;下面這個效率可能會差點回答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. python2.7 - python 正則前瞻 后瞻 無法匹配到正確的內(nèi)容2. python - 請問這兩個地方是為什么呢?3. python - 如何使用websocket在網(wǎng)頁上動態(tài)示實時數(shù)據(jù)的折線圖?4. java - Mybatis 數(shù)據(jù)庫多表關(guān)聯(lián)分頁的問題5. mysql如何根據(jù)各自條件批量更新6. 急急急!!!求大神解答網(wǎng)站評論問題,有大神幫幫小弟嗎7. mysql - Sql union 操作8. Python處理Dict生成json9. javascript - 按鈕鏈接到另一個網(wǎng)址 怎么通過百度統(tǒng)計計算按鈕的點擊數(shù)量10. (python)關(guān)于如何做到按win+R再輸入文件文件名就可以運行?
