2011-04-04 155 views
0

我無法將多個表連接到主表。我的第一個連接是LEFT OUTER JOIN,它只是將兩個表放在一起,用於整個視圖的兩半(爲什麼他們拆分表與安全性有關)。我在主表上存儲了多個存儲爲ID的項目,例如product_id,application_id,state_id和retailer_id。如預期的那樣,這些名稱中的每一個都存儲在自己的表中。SQL Server 2005:多個INNER JOIN表達式

我的發言工作正常與LEFT OUTER JOIN和內部連接,但聲明停在內連接返回數據。我不知道我是如何組建我的INNER JOINs或者是什麼問題的:

FROM ((((MyDbo.warranty w 
    INNER JOIN MyDbo.products p1 ON w.product_id = p1.product_id) 
    INNER JOIN MyDbo.applications ap1 ON w.application_id = ap1.application_id) 
    INNER JOIN MyDbo.retailers r1 ON w.retailer_id = r1.retailer_id) 
    INNER JOIN MyDbo.states s1 ON w.state_id = s1.state_id) 
    LEFT OUTER JOIN MyDbo.warranty_info i on w.warranty_id = i.warranty_id 

我在這裏的基地嗎?

+1

爲什麼所有括號?,我們可以擁有所有的語句,從'FROM'開始? – Lamak 2011-04-04 19:28:34

+0

對不起,我的select語句非常複雜,並且通過幾個條件和VB代碼中的循環連接起來。另外還有幾個需要編輯的揭示對象名稱。直到我添加INNER JOIN,我纔有了這個陳述,所以我認爲這是我使用的術語是正確的或者是我形成它的方式。雖然括號可以幫助我組織聲明,但看起來他們毫無意義。 – Dexter 2011-04-04 20:54:21

回答

4

如果INNER JOIN阻止您獲取記錄,那麼您遇到了JOIN條件的問題。

來測試這一點,最好的方法是使用LEFT JOIN然後WHERE子句中右表尋找NULL,如:

SELECT * 
FROM table t1 
LEFT JOIN table2 t2 
    ON t1.key = t2.key 
WHERE t2.key IS NULL 

或者您可以使用WHERE NOT EXISTS

SELECT * 
FROM table t1 
WHERE NOT EXISTS (SELECT NULL 
        FROM Table2 t2 
        WHERE t2.key = t1.key) 
+0

嗯,我知道在我的主表中(猜這就是你的意思?)我有空值。但是,我有一個CASE在我的SELECT中,當w.state_id爲NULL時,會拉w.state_other。所以,如果該列有NULL,我應該永久使用LEFT OUTER JOIN嗎? – Dexter 2011-04-04 19:32:07

+1

不僅僅是'NULL'。如果你有一個連接鍵,你的行不匹配(例如,'NULL'在右邊,但不在左邊,例如),並且你想要這些行,你必須**使用'LEFT JOIN' - 'INNER JOIN '完全從結果集中消除那些,這就是目的。 – JNK 2011-04-04 19:34:53

+1

這是完全有道理的。我的想法是,如果我有一個條件不拉空值或不匹配的結果,而是轉到另一列的結果,那麼它將消除對左邊的需要。現在我明白在選擇列之前結果會被過濾掉。謝謝你,現在正在工作。 – Dexter 2011-04-04 20:50:45