2011-03-02 132 views
-1

有點麻煩,想象一下連接應該如何查找我試圖實現的特定結果集。SQL:加入三個表 - 內部/外部聯合外部聯接?

我有三個表格:項目,建議,服務。建議只是項目和服務之間的連接表,即項目可能有零個或多個推薦的服務;爲了捕獲這種關係,建議表對每個建議記錄都有一個project_id和service_id。

因此,相關領域:

Projects.id | Recommendations.project_id | Recommendations.service_id | Services.id 

我想拉對此有特定服務號建議的所有項目的列表。我有以下,這對於拉動其中有根本不建議所有的項目,那就是:

SELECT * from projects P 
LEFT OUTER JOIN Recommendations R ON P.id = R.project_id 
WHERE R.project_id IS NULL 

我知道我需要加入該服務表爲好,但我不知道我是怎麼應該構造它。任何提示都表示讚賞。

+0

除了通過'Recommendations'表之外,'Projects'和'Services'之間沒有關係? – 2011-03-02 15:33:05

+0

這是正確的。 – David 2011-03-02 15:44:09

回答

2
SELECT P.* from projects P 
LEFT JOIN Recommendations R 
    ON P.id = R.project_id 
LEFT JOIN Services S 
    ON S.Service_id = R.service_id and s.ID = 10 
WHERE s.service_id is null 

這應該會發現沒有服務ID這些記錄是10注我拿出其中 條款R.project_id IS空值。你也可以使用子查詢的方法(這很可能是快,但測試兩個。)

SELECT * 
FROM projects 
WHERE NOT EXISTS (SELECT * 
        FROM recommendations R 
        JOIN Services S 
         ON S.Service_id = R.service_id 
        WHERE project_id=projects.id and s.ID = 10) 

當然,在現實生活中,你不會想使用select *以往任何時候。請把你想要的實際字段放在選擇部分。

+2

+1:但是,你甚至不需要加入到「服務」表中。只是'...左加入建議R ON P.id = R.project_id AND R.service_id = 10 WHER R.service_id IS NULL' – 2011-03-02 15:41:26

+0

謝謝 - 這看起來更接近我需要的東西。雖然沒有S.service_id;每個表格的關鍵僅僅是'id'。我會修補這個。我只是選擇了*作爲問題的目的,因爲它的輸入時間較短 - 我實際上並沒有在應用程序中回退每一個字母。 – David 2011-03-02 15:42:45

+0

@ Joe Stefanelli,我認爲你是對的。 – HLGEM 2011-03-02 16:23:18

2

一種選擇是子查詢的方法,無需任何加盟:

SELECT * FROM projects WHERE NOT EXISTS (SELECT * FROM recommendations WHERE project_id=projects.id AND recommendations.service_id=10) 
+0

感謝您的回覆。這只是返回與我的帖子中的查詢相同的結果,也就是說它向我展示了對於任何服務都沒有推薦的所有項目。我試圖做的是獲得一個項目列表,其中對於一項特定服務沒有建議,即對該項目可能有其他建議。 – David 2011-03-02 15:38:46

+0

對不起,讀得不快。 @ HLGEM的解決方案看起來不錯,而且在服務表上的連接確實看起來是多餘的 - 所以基本上我在上面的子查詢建議中加入了「AND recommendations.service_id = 10」。 – 2011-03-02 21:34:07