UNION,EXISTS,IN等在SQL语句中的灵活应用和场境的选择。
今天在QQ群里,有朋友問我這樣的一個SQL Server中查詢數據的問題,
表 A:
num?????? unit
001??????? a
002??????? b
003??????? c
表 B:
num????? unit
001??????? d
查詢顯示結果
001???? d
002???? b
003???? c
怎么實現?
看了這個問題第一感覺是,有點難度。
不過要表達的意思很明白:匹配的顯示b,不匹配顯示a.
問題來了,簡單的SQL語句中無法找到這樣的查詢方式能完成這項工作,不回答別人吧,又難受。說不會,顯得很沒面子。怎么辦呢?
于是以最短的時間分析了下,發現我可以分成兩個查詢兩完成工作。
即:SELECT a.num, b.unit
FROM a INNER JOIN
????? b ON a.num = b.num
和
SELECT DISTINCT a.num, a.unit
FROM a WHERE a.num NOT IN
????????? (SELECT b.num
???????? FROM b)
而清楚的記得union可以將兩個集合合并,只要集合的字段數目和類型是一樣的。
那就好辦,于是寫下:
SELECT a.num, b.unit
FROM a INNER JOIN
????? b ON a.num = b.num
UNION
SELECT DISTINCT a.num, a.unit
FROM a WHERE a.num NOT IN
????????? (SELECT b.num
???????? FROM b)
測試執行,搞定。
如果字段多,寫起來麻煩,想使用*,則部分數據冗余的寫法是:
SELECT a.*, b.unit AS extend
FROM a INNER JOIN
????? b ON a.num = b.num
UNION
SELECT DISTINCT a.*, a.unit AS extend
FROM a WHERE a.num NOT IN
????????? (SELECT b.num
???????? FROM b)
本以為問題就這樣解決了,但問題又來了,原因是這對單個字段是唯一鍵或主鍵時有效,如果唯一鍵是兩個或兩個以上的字段組成就不行了。
如
表 A:
num????num2?? unit
001???????a???? ?a
002???????b???? ?b
003?????? c??????c
表 B:
num???num2?? unit
001????? a???? ?? d
查詢顯示結果
num num1 unit
001????a ? d
002?? ?b?? b
003??? c? ?c
于是改寫成
SELECT a.*, b.unit AS extend
FROM a INNER JOIN
????? b ON a.num = b.num and a.num1 = b.num1
UNION
SELECT DISTINCT a.*, a.unit AS extend
FROM a
WHERE not exists?
(SELECT * from b where a.num=b.num and a.num1=b.num1)
轉載于:https://www.cnblogs.com/begincsdn/archive/2005/11/22/281783.html
總結
以上是生活随笔為你收集整理的UNION,EXISTS,IN等在SQL语句中的灵活应用和场境的选择。的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 获取指定路径下的所有文件
- 下一篇: 报表服务扩展:基于WCF技术的报表服务扩