人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動態(tài)

sql連接查詢中,where關(guān)鍵字的位置講解

發(fā)布日期:2021-12-31 09:26 | 文章來源:腳本之家

由于筆者天生笨拙,且思維不嚴(yán)謹(jǐn),也實在不擅長寫sql語句,高手請勿見笑,就請直接跳過本文吧。

背景就不多介紹了,先建表,插入測試數(shù)據(jù)吧。字段那些都有注釋

復(fù)制代碼 代碼如下:

--醫(yī)生表
CREATE TABLE doctor
(
id INT IDENTITY(1, 1) , --ID 自增長
docNumber NVARCHAR(50) NOT NULL , --醫(yī)生編碼
NAME NVARCHAR(50) NOT NULL --醫(yī)生姓名
)
go

--插入測試數(shù)據(jù)
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 , --和醫(yī)生表中的醫(yī)生編碼對應(yīng)
workTime DATETIME NOT NULL
)

go
--插入測試數(shù)據(jù)
INSERT INTO Nosource
VALUES ( '007', '20120819' )
INSERT INTO Nosource
VALUES ( '007', '20120820' )
INSERT INTO Nosource
VALUES ( '007', '20120821' )
INSERT INTO Nosource
VALUES ( '008', '20120821' )


表建好之后,測試數(shù)據(jù)也OK。下面開始說需求啦。

1.查出每位醫(yī)生的相關(guān)信息,以及該醫(yī)生所擁有的號源數(shù)量。

這簡直太簡單了,可能連剛學(xué)會helloWorld和一點點數(shù)據(jù)庫基礎(chǔ)的朋友都會嚴(yán)重真心BS。不過代碼還是寫出來。

復(fù)制代碼 代碼如下:

--簡單的分組查詢即可搞定
SELECT COUNT(nos.id) AS PersonNumSounceCOUNT , --總數(shù)
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

確實簡單啊。一個小小的分組就能搞定的。還賣什么關(guān)子呢。

那現(xiàn)在需求改變,需要按條件去匹配:要求號源表的workTime大于當(dāng)前日期才算有效的,否則就不匹配。
如果workTime條件不匹配的醫(yī)生,對應(yīng)的PersonNumSounceCOUNT字段的值應(yīng)為0 ;例如:Jim醫(yī)生沒有匹配和符合條件的號源,其PersonNumSounceCOUNT字段值應(yīng)為0。抬頭仰望天空40度,想想能夠用where關(guān)鍵字過濾,然后一次性查詢出來嗎?試試吧。

復(fù)制代碼 代碼如下:

SELECT COUNT(nos.id) AS PersonNumSounceCOUNT , --總數(shù)
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

相信有人會寫出上面的代碼來??墒菆?zhí)行查詢后,發(fā)現(xiàn)完全不符合要求啊。連Jim醫(yī)生的基本信息和表記錄也都被過濾掉了,不見了。咋回事???

原因很簡單嘛。在連接查詢的后面使用"where"關(guān)鍵字,會過濾連接查詢的結(jié)果集中的數(shù)據(jù)。由于右表(號源表)的條件不匹配,也會導(dǎo)致左表(醫(yī)生表)的數(shù)據(jù)被過濾掉。

所以,會出現(xiàn)以上的現(xiàn)象(Jim醫(yī)生的信息和記錄都不見了)。要想一次性查出來可能嗎?到底該如何去實現(xiàn)呢?

其實,正確的寫法應(yīng)該是這樣的:

復(fù)制代碼 代碼如下:

SELECT COUNT(nos.id) AS PersonNumSounceCOUNT , --總數(shù)
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

再執(zhí)行一下,果然OK,是滿足要求的結(jié)果。思路就是:只需要過濾右表,就將(使用子查詢)過濾后的結(jié)果集作為連接查詢的右表,然后再去連接,分組......

其實編寫簡潔而高性能的sql語句,是需要很強(qiáng)的邏輯思維能力(和數(shù)學(xué)分不開)和經(jīng)驗的。還有種更簡單的寫法:

復(fù)制代碼 代碼如下:

SELECT sum(case when nos.workTime>getdate then 1 else 0 end) AS PersonNumSounceCOUNT , --總數(shù)
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

這樣去解釋,不知道大家是否能夠理解,反正大致意思就是這樣的。筆者的表達(dá)能力和水平確實有限,難免有偏差,望讀者諒解!

版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。

實時開通

自選配置、實時開通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問服務(wù)

1對1客戶咨詢顧問

在線
客服

在線客服:7*24小時在線

客服
熱線

400-630-3752
7*24小時客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部