2012-10-03 44 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 *。