2012-10-03 78 views
0

我有一個一對多的連接。完美無瑕地工作,並且很快。一對多在許多表中可能有零個記錄。如果是這種情況,我想將它加入到許多表中的所有記錄中。SQL一對多或多對多?

USERS 
----- 
UserID | Name 

CATEGORIES 
------------------ 
CategoryID | CategoryName 

USER_CATEGORIES 
--------------- 
UserID | CategoryID 

如果沒有分配給用戶的類別,我想加入所有類別。這背後的原因是,一些用戶可能會管理所有類別。如果添加了類別,則會自動分配給這些用戶。

1 | Michael 
2 | Bob 

100 | Billing 
101 | Email 
102 | Technical 

1 | 101 

我想結果是:

1 | Michael | 101 | Email 
2 | Bob | 100 | Billing 
2 | Bob | 101 | Email 
2 | Bob | 102 | Technical 

到目前爲止,它的工作方式是:

DECLARE @USERS TABLE (UserID INT, UserName VARCHAR(10)); 
DECLARE @USER_CATEGORIES TABLE (UserID INT, CategoryID INT); 
DECLARE @CATEGORIES TABLE (CategoryID INT, CategoryName VARCHAR(10)); 

INSERT INTO @USERS (UserID, UserName) 
(
    SELECT 1, 'Michael' UNION ALL 
    SELECT 2, 'Bob' 
) 

INSERT INTO @CATEGORIES (CategoryID, CategoryName) 
(
    SELECT 100, 'Billing' UNION ALL 
    SELECT 101, 'Email' UNION ALL 
    SELECT 102, 'Technical' 
) 

INSERT INTO @USER_CATEGORIES (UserID, CategoryID) 
(
    SELECT 1, 101 
) 

SELECT 
    U.UserID 
    , U.UserName 
    , C2.CategoryID 
    , C2.CategoryName 
FROM 
    @USERS U LEFT JOIN 
    @USER_CATEGORIES UC ON U.UserID = UC.UserID LEFT JOIN 
    @CATEGORIES C ON UC.CategoryID = C.CategoryID LEFT JOIN 
    @CATEGORIES C2 ON C.CategoryID = C2.CategoryID OR (C.CategoryID IS NULL) 

這是處理這一正確的方法是什麼?當我有很多用戶/類別組合時,它似乎有點太多的開銷。

回答

1

您可以刪除的加入到@CATEGORIES之一:

SELECT 
    U.UserID 
    , U.UserName 
    , C2.CategoryID 
    , C2.CategoryName 
FROM @USERS U 
    LEFT JOIN @USER_CATEGORIES UC 
    ON U.UserID = UC.UserID 

    LEFT JOIN @CATEGORIES C2 
    ON UC.CategoryID = C2.CategoryID 
    OR (UC.CategoryID IS NULL) 
+0

這似乎颳了一段時間的腳本。謝謝!這是一個幫助。我不知道爲什麼我沒有看到。 –

0

呃,如果你在查詢一個類別或一個用戶,然後當我發現它在美學上進攻,沒關係。

對於所有用戶和類別?不適合我,不,

不能說你應該走哪條路。因爲我不知道爲什麼你想要這個數據

但我我會返回說'ALL'內部聯接的結果是null,或者我只是使用它返回沒有該用戶的記錄,如果我需要它並且沒有緩存它,則從類別中觸發select *。