sql 查詢求助:如何從兩張表中查詢不重復(fù)結(jié)果
本文將解決一個(gè)常見的 sql 查詢問題,該問題涉及從兩張表中查詢不重復(fù)的結(jié)果。
問題描述:
假設(shè)我們有兩張表,a 和 b,如下所示:
a 表:
sid | name |
---|---|
1 | 張三 |
2 | 李四 |
3 | 王五 |
b 表:
sid | tracking_number |
---|---|
1 | 123 |
1 | 456 |
2 | 789 |
3 | 101 |
我們的目標(biāo)是查詢一條 sql 語句,以 a 表為基準(zhǔn),獲取不重復(fù)的結(jié)果,這意味著對(duì)于具有相同 sid 的記錄,我們只需要保留一行結(jié)果。
解決方案:
可以使用 left join 和子查詢來實(shí)現(xiàn)所需的結(jié)果:
select * from a left join ( select sid, max(tracking_number) from b group by sid ) b on a.sid = b.sid;
子查詢用于從 b 表中獲取每個(gè) sid 的最大跟蹤號(hào)。然后,我們使用 left join 將此子查詢與 a 表關(guān)聯(lián),并選擇 a 表中的所有列以及 b 表中的跟蹤號(hào)。
替代方案:
對(duì)于某些數(shù)據(jù)庫,如 mysql,可以使用 group by 和 max() 函數(shù)直接在子查詢中獲取最大跟蹤號(hào):
select * from a left join ( select sid, max(tracking_number) as tracking_number from b group by sid ) b on a.sid = b.sid;
如果主鍵位于 b 表中,我們還可以使用以下查詢:
SELECT a.*, b.tracking_number, b.is_cancel FROM a LEFT JOIN b ON a.sid = b.sid WHERE b.id IN ( SELECT MAX(id) FROM b GROUP BY sid );
此查詢將選擇 a 表中的所有行,以及來自 b 表的跟蹤號(hào)和取消標(biāo)志,其中 id 是 b 表中的最大 id。
? 版權(quán)聲明
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載。
THE END