佳木斯湛栽影视文化发展公司

主頁(yè) > 知識(shí)庫(kù) > sql連接查詢(xún)中,where關(guān)鍵字的位置講解

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

熱門(mén)標(biāo)簽:AI電銷(xiāo) 服務(wù)外包 鐵路電話(huà)系統(tǒng) 呼叫中心市場(chǎng)需求 百度競(jìng)價(jià)排名 網(wǎng)站排名優(yōu)化 Linux服務(wù)器 地方門(mén)戶(hù)網(wǎng)站

由于筆者天生笨拙,且思維不嚴(yán)謹(jǐn),也實(shí)在不擅長(zhǎng)寫(xiě)sql語(yǔ)句,高手請(qǐng)勿見(jiàn)笑,就請(qǐng)直接跳過(guò)本文吧。

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

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

--醫(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)。

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

--簡(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)嗎?試試吧。

復(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

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

原因很簡(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)該是這樣的:

復(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,是滿(mǎn)足要求的結(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ě)法:

復(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

這樣去解釋?zhuān)恢来蠹沂欠衲軌蚶斫?,反正大致意思就是這樣的。筆者的表達(dá)能力和水平確實(shí)有限,難免有偏差,望讀者諒解!

您可能感興趣的文章:
  • SQL語(yǔ)句的各個(gè)關(guān)鍵字的解析過(guò)程詳細(xì)總結(jié)
  • sql中的left join及on、where條件關(guān)鍵字的區(qū)別詳解
  • Mysql帶And關(guān)鍵字的多條件查詢(xún)語(yǔ)句
  • MySQL單表多關(guān)鍵字模糊查詢(xún)的實(shí)現(xiàn)方法
  • MySQL 5.7中的關(guān)鍵字與保留字詳解
  • sql server關(guān)鍵字詳解大全(圖文)
  • SQL中一些小巧但常用的關(guān)鍵字小結(jié)

標(biāo)簽:黃山 仙桃 銅川 衡水 湘潭 湖南 崇左 蘭州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《sql連接查詢(xún)中,where關(guān)鍵字的位置講解》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話(huà)咨詢(xún)

    • 400-1100-266
    仙居县| 普兰县| 灵川县| 昌吉市| 宜君县| 时尚| 仙桃市| 凤城市| 潮安县| 江都市| 台江县| 垣曲县| 英吉沙县| 浑源县| 鹤庆县| 朔州市| 耒阳市| 晋宁县| 正蓝旗| 古交市| 时尚| 阳高县| 安吉县| 赤峰市| 石渠县| 咸宁市| 乐昌市| 鄂尔多斯市| 宿州市| 大荔县| 克东县| 织金县| 奉贤区| 灵武市| 常宁市| 阿合奇县| 安岳县| 民和| 崇礼县| 阿拉善左旗| 诸暨市|