2012-06-12 98 views
1

我有三個表建立一個特定的SQL查詢

Employee  
    SSN Name 
    1 a 
    2 b 
    3 c 

    Projects  
    Pno Name 
    1 x 
    2 y 
    3 z 

    Works_On  
    ESSN Pno 
    1  1 
    1  2 
    2  1 
    3  1 
    3  2 
    3  3 

好了,問題是,我怎麼知道(被查詢),該員工適用於所有項目。我似乎無法比較多與多。

謝謝你,對不起,一個愚蠢的問題。

回答

4

一種方式來做到這一點是統計所有項目,計算項目的員工數量,然後選擇在相同數量的項目工作的所有員工:

DECLARE @ProjectCount int 
SELECT @ProjectCount = Count(*) FROM Projects 

SELECT e.* 
FROM Employee e 
WHERE (SELECT COUNT(1) FROM Works_On w WHERE w.ESSN = e.SSN) = @ProjectCount 

ProjectCount變量是有跳過計數項目爲每一位員工。

UPDATE:它是如何工作:

爲每位員工計算多少記錄是Works_On表字段ESSN等於當前僱員的SSN然後這個數字比較項目總數。 查詢:

SELECT COUNT(1) FROM Works_On 

會給你(你的情況6)在Works_On表中的記錄總數。我們要統計有多少記錄有每個員工,這就是爲什麼我們嵌入在我們的條件主要查詢的查詢從Works_On表具有當前員工SSN只選擇記錄。如果你有一些編程語言來寫這個,這是邏輯上等同於foreach循環員工集合,其中在循環的身體,你選擇Works_On表中的所有記錄,當前員工,然後將其與項目總數相比較。如果當前員工的項目數量等於項目總數,請對其進行計數。

我希望這會有所幫助。

+0

你們是更好:) – LukeP

+0

肯定能行!謝謝,不得不刪除你創建的變量,以使其在MySQL上工作。你能解釋它是如何工作的嗎?當我運行子查詢時,它給了我6,而項目數量爲3 – Shakir

+0

我很高興我可以提供幫助。我已經通過簡短的解釋擴展瞭解決方案。如果您仍有問題,請詢問。 – Kosta

0

我將在count工作。

SELECT e.SSN 
FROM Employee e, 
    (SELECT w.ESSN, COUNT(*) AS count FROM Works_On w WHERE w.ESSN = e.SSN GROUP BY w.ESSN) wcount, 
    (SELECT COUNT(*) AS count FROM Projects) p -- you can avoid this by calculating it before. 
WHERE wcount.ESSN = e.SSN 
AND p.count = wcount.count 
+0

這似乎沒有工作 – LukeP

+0

有一個小錯誤。我已糾正它。你現在可以試試嗎? – JHS

+0

這不是我的問題,但我得到以下錯誤:不能綁定多部分標識符「e.ESSN」。 – LukeP

0

試試這個:

SELECT Employee.Name, Projects_On 
FROM (
    SELECT Works_On.ESSN, COUNT(*) AS [Projects_On] 
    FROM [Works_On] INNER JOIN [Projects] ON Projects.Pno = Works_On.PNO 
    GROUP BY [ESSN]) A 

INNER JOIN Employee ON Employee.SSN = Essn 
WHERE Projects_On = (SELECT COUNT(*) FROM Projects) 

這不是有史以來最漂亮的查詢,但它似乎工作。