0

我有一个一对多的加入。完美无瑕地工作,而且速度很快。一对多在 many 表中可能有零条记录。如果是这种情况,我想将它加入到许多表中的所有记录中。

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)

这是处理这个问题的正确方法吗?当我有很多用户/类别组合时,这似乎有点过多的开销。

4

2 回答 2

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)
于 2012-10-03T21:02:05.833 回答
0

呃,如果你要查询一个类别或一个用户,那么虽然我觉得它在美学上令人反感,好吧。

对于所有用户和类别?不适合我,不

不能说你应该走哪条路。因为我不知道你为什么想要这些数据

但是我要么返回说'ALL',内部连接的结果为空,或者我只是使用它不为该用户返回任何记录,以触发 select * from categories 如果我需要它并且还没有缓存它。

于 2012-10-03T21:09:14.773 回答