程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> MSSQL >> sql銜接查詢中,where症結字的地位講授

sql銜接查詢中,where症結字的地位講授

編輯:MSSQL

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

如許去說明,不曉得年夜家能否可以或許懂得,橫豎年夜請安思就是如許的。筆者的表達才能和程度確切無限,不免有誤差,望讀者原諒!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved