sql銜接查詢中,where症結字的地位講授。本站提示廣大學習愛好者:(sql銜接查詢中,where症結字的地位講授)文章只能為提供參考,不一定能成為您想要的結果。以下是sql銜接查詢中,where症結字的地位講授正文
因為筆者生成愚笨,且思想不嚴謹,也其實不善於寫sql語句,高手請勿見笑,就請直接跳過本文吧。
配景就不多引見了,先建表,拔出測試數據吧。字段那些都有正文
--大夫表
CREATE TABLE doctor
(
id INT IDENTITY(1, 1) , --ID 自增加
docNumber NVARCHAR(50) NOT NULL , --大夫編碼
NAME NVARCHAR(50) NOT NULL --大夫姓名
)
go
--拔出測試數據
INSERT INTO doctor
VALUES ( '007', 'Tom' )
INSERT INTO doctor
VALUES ( '008', 'John' )
INSERT INTO doctor
VALUES ( '009', 'Jim' )
--號源表(掛號表)
CREATE TABLE Nosource
(
id INT IDENTITY(1, 1) ,
docNumber NVARCHAR(50) NOT NULL , --和大夫表中的大夫編碼對應
workTime DATETIME NOT NULL
)
go
--拔出測試數據
INSERT INTO Nosource
VALUES ( '007', '20120819' )
INSERT INTO Nosource
VALUES ( '007', '20120820' )
INSERT INTO Nosource
VALUES ( '007', '20120821' )
INSERT INTO Nosource
VALUES ( '008', '20120821' )
表建好以後,測試數據也OK。上面開端說需求啦。
1.查出每位大夫的相干信息,和該大夫所具有的號源數目。
這的確太簡略了,能夠連剛學會helloWorld和一點點數據庫基本的同伙都邑嚴重真心BS。不外代碼照樣寫出來。
--簡略的分組查詢便可弄定
SELECT COUNT(nos.id) AS PersonNumSounceCOUNT , --總數
dct.ID AS docID ,
dct.NAME ,
dct.docNumber ,
nos.workTime
FROM doctor AS dct
LEFT JOIN Nosource AS nos ON dct.docNumber = nos.docNumber
GROUP BY dct.ID ,
dct.NAME ,
dct.docNumber ,
nos.workTime
確切簡略啊。一個小小的分組就可以弄定的。還賣甚麼關子呢。
那如今需求轉變,須要按前提去婚配:請求號源表的workTime年夜於以後日期才算有用的,不然就不婚配。
假如workTime前提不婚配的大夫,對應的PersonNumSounceCOUNT字段的值應為0 ;例如:Jim大夫沒有婚配和相符前提的號源,其PersonNumSounceCOUNT字段值應為0。昂首瞻仰天空40度,想一想可以或許用where症結字過濾,然後一次性查詢出來嗎?嘗嘗吧。
SELECT COUNT(nos.id) AS PersonNumSounceCOUNT , --總數
dct.ID ,
dct.NAME ,
dct.docNumber ,
nos.workTime
FROM doctor AS dct
LEFT JOIN Nosource AS nos ON dct.docNumber = nos.docNumber
WHERE DATEDIFF(day, GETDATE(), nos.workTime) > 0
GROUP BY dct.ID ,
dct.NAME ,
dct.docNumber ,
nos.workTime
信任有人會寫出下面的代碼來。可是履行查詢後,發明完整不相符請求啊。連Jim大夫的根本信息和表記載也都被過濾失落了,不見了。咋回事啊?
緣由很簡略嘛。在銜接查詢的前面應用"where"症結字,會過濾銜接查詢的成果集中的數據。因為右表(號源表)的前提不婚配,也會招致左表(大夫表)的數據被過濾失落。
所以,會湧現以上的景象(Jim大夫的信息和記載都不見了)。要想一次性查出來能夠嗎?究竟該若何去完成呢?
其實,准確的寫法應當是如許的:
SELECT COUNT(nos.id) AS PersonNumSounceCOUNT , --總數
dct.ID ,
dct.NAME ,
dct.docNumber ,
nos.workTime
FROM doctor AS dct
LEFT JOIN ( SELECT *
FROM Nosource
WHERE DATEDIFF(day, GETDATE(), workTime) > 0
) AS nos ON dct.docNumber = nos.docNumber
GROUP BY dct.ID ,
dct.NAME ,
dct.docNumber ,
nos.workTime
再履行一下,果真OK,是知足請求的成果。思緒就是:只須要過濾右表,就將(應用子查詢)過濾後的成果集作為銜接查詢的右表,然後再去銜接,分組......
其實編寫簡練而高機能的sql語句,是須要很強的邏輯思想才能(和數學分不開)和經歷的。還有種更簡略的寫法:
SELECT sum(case when nos.workTime>getdate then 1 else 0 end) AS PersonNumSounceCOUNT , --總數
dct.ID AS docID ,
dct.NAME ,
dct.docNumber
FROM doctor AS dct
LEFT JOIN Nosource AS nos ON dct.docNumber = nos.docNumber
GROUP BY dct.ID ,
dct.NAME ,
dct.docNumber
如許去說明,不曉得年夜家能否可以或許懂得,橫豎年夜請安思就是如許的。筆者的表達才能和程度確切無限,不免有誤差,望讀者原諒!