日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

UNION,EXISTS,IN等在SQL语句中的灵活应用和场境的选择。

發(fā)布時間:2025/3/15 数据库 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 UNION,EXISTS,IN等在SQL语句中的灵活应用和场境的选择。 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

今天在QQ群里,有朋友問我這樣的一個SQL Server中查詢數(shù)據(jù)的問題,
表 A:
num?????? unit
001??????? a
002??????? b
003??????? c

表 B:
num????? unit
001??????? d


查詢顯示結(jié)果
001???? d
002???? b
003???? c

怎么實現(xiàn)?

看了這個問題第一感覺是,有點難度。
不過要表達的意思很明白:匹配的顯示b,不匹配顯示a.

問題來了,簡單的SQL語句中無法找到這樣的查詢方式能完成這項工作,不回答別人吧,又難受。說不會,顯得很沒面子。怎么辦呢?

于是以最短的時間分析了下,發(fā)現(xiàn)我可以分成兩個查詢兩完成工作。
即: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可以將兩個集合合并,只要集合的字段數(shù)目和類型是一樣的。
那就好辦,于是寫下:
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)

測試執(zhí)行,搞定。

如果字段多,寫起來麻煩,想使用*,則部分數(shù)據(jù)冗余的寫法是:
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


查詢顯示結(jié)果
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)

轉(zhuǎn)載于:https://www.cnblogs.com/begincsdn/archive/2005/11/22/281783.html

總結(jié)

以上是生活随笔為你收集整理的UNION,EXISTS,IN等在SQL语句中的灵活应用和场境的选择。的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。