2011-12-13 54 views
1

我需要在SQL Server中加入3個表。這3代表也基本這個模式:加入來自三個表的所有信息的查詢

Users    Items      UsersItems 
+--------+ +--------+-------------+ +--------+--------+-------+ 
| UserID | | ItemID | Description | | UserID | ItemId | Value | 
+--------+ +--------+-------------+ +--------+--------+-------+ 
| 1 | | 1 | desc1 | | 1 | 1 | 1 | 
| 2 | | 2 | desc2 | | 1 | 2 | 2 | 
| ... | | ... | desc3 | | 2 | 2 | 1 | 
| n | | n | desc4 | | n | 1 | 1 | 
+--------+ +--------+-------------+ +--------+--------+-------+ 

正如你所看到的用戶和項目可以無限增長和UsersItems用來表達這兩個之間的關係,也包括值列。

我需要一個查詢來檢索所有用戶,併爲每個用戶我需要所有與它相應的值的項目。

如果在中不存在關係,則應爲該行的Value列返回Null(或缺省值)。

預期的查詢結果應該是:

   ResultSet 
    +--------+--------+-------+ 
    | UserID | ItemID | Value | 
    +--------+--------+-------+ 
    | 1 | 1 | 1 | 
    | 1 | 2 | 2 | 
    | 1 | n | NULL | 
    | 2 | 1 | NULL | 
    | 2 | 2 | 1 | 
    | 2 | n | NULL | 
    | n | 1 | 1 | 
    | n | n | NULL | 
    +--------+--------+-------+ 
+1

閱讀關於LEFT JOIN並嘗試一些東西。 – Bill

+1

其實,也讀過CROSS JOIN。 – paulbailey

+0

你問我們做功課嗎? –

回答

2

好了,因爲有好幾個答案,我認爲是不正確的,我會發布什麼,我想答案是:

SELECT Users.UserID, 
     Items.Description, 
     UsersItems.Value 
FROM 
     Users 
CROSS JOIN 
     Items 
LEFT JOIN 
     UsersItems 
ON 
     Users.UserID = UsersItems.UserID 
AND 
     Items.ItemID = UsersItems.ItemID 

我從您的評論推斷約零點你想要查看所有用戶對所有用戶的所有項目,並使用UsersItems表中存在的值。

+0

這是我放棄時的查詢,我剛剛缺少'AND'語句,因此我在'Value'列中獲取了不真實的值。比你! – PedroC88

1
SELECT 
    Users.UserID, 
    Items.Description, 
    Items.Value 

FROM Users LEFT OUTER JOIN UsersItems 
      ON Users.UserID = UsersItems.UserID 
    LEFT OUTER JOIN Items 
      ON UserItems.ItemID = Items.ItemID 
+1

這不會起作用,因爲如果UsersItems中沒有行,則無法加入項目。 – paulbailey

+0

他說null如果沒有關係就沒問題,這就是爲什麼它的外連接 – Maess

+0

@paulbailey如果沒有連接,外連接選擇NULL,如果表之間存在連接,則選擇info。這正是你想要的。 Maess是正確的。 –

0

你不喜歡這樣:

SELECT Users.UserID, Items.Description, Items.Value 
FROM Users 
LEFT OUTER JOIN UsersItems ON Users.UserID = UsersItems.UserID 
LEFT OUTER JOIN Items ON UserItems.ItemID = Items.ItemID 

有關左外更多信息加入閱讀以下內容:

對於表A和 B,左外連接(或簡單左連接)的結果始終包含「左」表(A)的所有記錄,即使 連接條件未在「右邊「表 (B)。這意味着如果ON子句匹配B, 中的0(零)記錄,則連接仍然會在結果中返回一行,但在B的每個 列中都返回NULL。這表示左外部聯接返回所有 值從左表中加上右表 的匹配值(或者在沒有匹配聯接謂詞的情況下爲NULL)。如果右表 返回一行,並且左表爲其返回多個匹配行 ,則右表中的值將針對左表上的每個不同行重複。從Oracle 9i開始,可以使用左外部 JOIN語句以及(+)。