2017-02-27 29 views
0

我在閱讀「Inside Microsoft SQL Server 2008 Querying」一書。在第95頁, 作者解釋除法運算符的例子;基本上它返回了所有來自美國的員工都處理過至少一個訂單的所有客戶。如何理解INSIDE SQL Server 2008查詢中有關除法運算符的查詢?

查詢就像這樣。

USE InsideTSQL2008; 

SELECT custid 
FROM Sales.Customers AS C 
WHERE NOT EXISTS (SELECT * 
        FROM HR.Employees AS E 
        WHERE country = N'USA' 
        AND NOT EXISTS (SELECT * 
            FROM Sales.Orders AS O 
            WHERE O.custid = C.custid 
             AND O.empid = E.empid)); 

首先,下面兩部分得到了美國員工處理的所有訂單。正確?

(SELECT * 
FROM HR.Employees AS E 
WHERE country = N'USA' 

SELECT * 
FROM Sales.Orders AS O 
WHERE O.custid = C.custid 
    AND O.empid = E.empid); 

如果是這樣,爲什麼他用NOT EXISTS過濾掉這些訂單?

這個查詢的目標是找到所有的客戶,至少有一個訂單由所有美國員工處理,它會篩選出正確的,正如我所看到的。

其次,我看不到任何與查詢有關的運算符。這個查詢如何隨分割而來?

+0

子查詢將返回與外部不具有相同'custid'的所有記錄。然後外面說給我我不是在子查詢中的每個記錄,基本上導致那些具有相同cusetid的記錄。不知道分隔線 – CodingYoshi

回答

1

首先,下面兩部分是美國員工處理的所有訂單。正確?

否。子查詢包含對通過C名稱的最外層查詢的引用,並且不能自行評估。此外,明確SELECT * FROM HR.Employees讓你的員工,而不是訂單。

完整的子查詢

SELECT * FROM HR.Employees AS E 
WHERE country = N'USA' 
AND NOT EXISTS 
(SELECT * FROM Sales.Orders AS O 
WHERE O.custid = C.custid 
AND O.empid = E.empid) 

這意味着「選擇哪個沒有訂購客戶C美國的員工。」一般來說,「每個Y都有Z的所有X」都可以改寫爲「不存在Y的所有X,其中不存在Z」。在你的情況,

所有客戶對他們來說,從美國的每一位員工已辦理至少一個訂單

可以改寫爲「對他們來說,沒有來自美國的員工還沒有所有的客戶處理任何命令「。

這就是爲什麼整個東西放在NOT EXISTS

其次,我看不到任何與查詢有關的運算符。這個查詢如何隨分割而來?

它是關係代數的一部分,而不是簡單的數字劃分。它被稱爲分割,因爲它是笛卡爾乘積的倒數(即交叉連接的倒數)。

請參閱https://en.wikipedia.org/wiki/Relational_algebra#Division_.28.C3.B7.29瞭解更多信息。

+0

非常感謝,hvd!現在這個查詢變得清晰了,分割也是如此。現在我試圖用邏輯「每個Y都有Z的所有X」來編寫一個新的查詢。如果我簡單地刪除兩個「NOT」,結果是不正確的。原因可能是「WHERE EXISTS」不能代表「所有X對於某事」,它可能代表可能有X代表某事,對吧?如果是這樣,你可以給我一個小費來處理它的邏輯嗎? –

+0

@ Ranger22你是對的,這就是原因。一般來說,我不建議用這種形式寫它,因爲它很難通過非常規的方式來閱讀,但如果你想實驗,那麼'ALL'關鍵字可能適用於:'select * from X where 1 =全部(選擇Z時爲1,否則爲0時結束)'。 – hvd

+0

再次感謝!我剛開始學習sql server。我發現對於解決問題的邏輯很難,然後根據邏輯進行查詢。基本上我不知道如何開始學習SQL查詢。如果你可以給我一些建議,比如如何開始,書本,練習等等,那真的很感謝! –