sql連接查詢(xún)中,where關(guān)鍵字的位置講解
由于筆者天生笨拙,且思維不嚴(yán)謹(jǐn),也實(shí)在不擅長(zhǎng)寫(xiě)sql語(yǔ)句,高手請(qǐng)勿見(jiàn)笑,就請(qǐng)直接跳過(guò)本文吧。
背景就不多介紹了,先建表,插入測(cè)試數(shù)據(jù)吧。字段那些都有注釋
--醫(yī)生表
CREATE TABLE doctor
(
id INT IDENTITY(1, 1) , --ID 自增長(zhǎng)
docNumber NVARCHAR(50) NOT NULL , --醫(yī)生編碼
NAME NVARCHAR(50) NOT NULL --醫(yī)生姓名
)
go
--插入測(cè)試數(shù)據(jù)
INSERT INTO doctor
VALUES ( '007', 'Tom' )
INSERT INTO doctor
VALUES ( '008', 'John' )
INSERT INTO doctor
VALUES ( '009', 'Jim' )
--號(hào)源表(掛號(hào)表)
CREATE TABLE Nosource
(
id INT IDENTITY(1, 1) ,
docNumber NVARCHAR(50) NOT NULL , --和醫(yī)生表中的醫(yī)生編碼對(duì)應(yīng)
workTime DATETIME NOT NULL
)
go
--插入測(cè)試數(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' )
表建好之后,測(cè)試數(shù)據(jù)也OK。下面開(kāi)始說(shuō)需求啦。
1.查出每位醫(yī)生的相關(guān)信息,以及該醫(yī)生所擁有的號(hào)源數(shù)量。
這簡(jiǎn)直太簡(jiǎn)單了,可能連剛學(xué)會(huì)helloWorld和一點(diǎn)點(diǎn)數(shù)據(jù)庫(kù)基礎(chǔ)的朋友都會(huì)嚴(yán)重真心BS。不過(guò)代碼還是寫(xiě)出來(lái)。
--簡(jiǎn)單的分組查詢(xún)即可搞定
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
確實(shí)簡(jiǎn)單啊。一個(gè)小小的分組就能搞定的。還賣(mài)什么關(guān)子呢。
那現(xiàn)在需求改變,需要按條件去匹配:要求號(hào)源表的workTime大于當(dāng)前日期才算有效的,否則就不匹配。
如果workTime條件不匹配的醫(yī)生,對(duì)應(yīng)的PersonNumSounceCOUNT字段的值應(yīng)為0 ;例如:Jim醫(yī)生沒(méi)有匹配和符合條件的號(hào)源,其PersonNumSounceCOUNT字段值應(yīng)為0。抬頭仰望天空40度,想想能夠用where關(guān)鍵字過(guò)濾,然后一次性查詢(xún)出來(lái)嗎?試試吧。
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
相信有人會(huì)寫(xiě)出上面的代碼來(lái)??墒菆?zhí)行查詢(xún)后,發(fā)現(xiàn)完全不符合要求啊。連Jim醫(yī)生的基本信息和表記錄也都被過(guò)濾掉了,不見(jiàn)了。咋回事啊?
原因很簡(jiǎn)單嘛。在連接查詢(xún)的后面使用"where"關(guān)鍵字,會(huì)過(guò)濾連接查詢(xún)的結(jié)果集中的數(shù)據(jù)。由于右表(號(hào)源表)的條件不匹配,也會(huì)導(dǎo)致左表(醫(yī)生表)的數(shù)據(jù)被過(guò)濾掉。
所以,會(huì)出現(xiàn)以上的現(xiàn)象(Jim醫(yī)生的信息和記錄都不見(jiàn)了)。要想一次性查出來(lái)可能嗎?到底該如何去實(shí)現(xiàn)呢?
其實(shí),正確的寫(xiě)法應(yīng)該是這樣的:
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é)果。思路就是:只需要過(guò)濾右表,就將(使用子查詢(xún))過(guò)濾后的結(jié)果集作為連接查詢(xún)的右表,然后再去連接,分組......
其實(shí)編寫(xiě)簡(jiǎn)潔而高性能的sql語(yǔ)句,是需要很強(qiáng)的邏輯思維能力(和數(shù)學(xué)分不開(kāi))和經(jīng)驗(yàn)的。還有種更簡(jiǎn)單的寫(xiě)法:
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
這樣去解釋?zhuān)恢来蠹沂欠衲軌蚶斫?,反正大致意思就是這樣的。筆者的表達(dá)能力和水平確實(shí)有限,難免有偏差,望讀者諒解!
相關(guān)文章
盤(pán)點(diǎn)SqlServer?分頁(yè)方式和拉姆達(dá)表達(dá)式分頁(yè)
這篇文章主要介紹了SqlServer?5種分頁(yè)方式和拉姆達(dá)表達(dá)式分頁(yè),進(jìn)來(lái)看看吧,本文結(jié)合示例代碼給大家講解的非常詳細(xì),需要的朋友可以參考下2022-12-12union組合結(jié)果集時(shí)的order問(wèn)題
如果能確定各查詢(xún)結(jié)果不會(huì)有重復(fù)的項(xiàng),最好就帶上all,因?yàn)檫@樣還是可以提高一些效率的。2009-09-09sqlserver建立新用戶及關(guān)聯(lián)數(shù)據(jù)庫(kù)教程
本文講的是SQLserver數(shù)據(jù)庫(kù)創(chuàng)建新用戶方法以及賦予此用戶特定權(quán)限的方法,非常的簡(jiǎn)單實(shí)用,有需要的小伙伴可以參考下2018-01-01使用用SQL語(yǔ)句從電腦導(dǎo)入圖片到數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了用SQL語(yǔ)句從電腦導(dǎo)入圖片到數(shù)據(jù)庫(kù)的方法,文中給大家提到了從MySQL數(shù)據(jù)庫(kù)讀取圖片和向數(shù)據(jù)庫(kù)插入圖片的代碼,需要的朋友可以參考下2019-09-09SqlServer中tempdb的日志機(jī)制原理解析及示例分享
tempdb為什么比其他數(shù)據(jù)庫(kù)快?估計(jì)95%以上的程序員們都一臉茫然.Tempdb作為Sqlserver的重要特征,一直以來(lái)大家對(duì)它可能即熟悉又陌生.熟悉是我們時(shí)時(shí)刻刻都在用,陌生可能是很少有人關(guān)注它的運(yùn)行機(jī)制.這次我將通過(guò)實(shí)例給大家介紹下tempdb的日志機(jī)制.2014-08-08在SQL Server中備份和恢復(fù)數(shù)據(jù)庫(kù)的四種方法
在SQL Server中,創(chuàng)建備份和執(zhí)行還原操作對(duì)于確保數(shù)據(jù)完整性、災(zāi)難恢復(fù)和數(shù)據(jù)庫(kù)維護(hù)至關(guān)重要,本文給大家介紹了備份和恢復(fù)數(shù)據(jù)庫(kù)的最佳方法,需要的朋友可以參考下2023-12-12