Sql server 2008 SQL-如何将两个表与第三个表链接并获取所有记录

Sql server 2008 SQL-如何将两个表与第三个表链接并获取所有记录,sql-server-2008,Sql Server 2008,好的,这是我的三张桌子: 用户 |--------+----------+----------| | UserID | UserName | IsActive | |--------+----------+----------| | 10 | Mike | 1 | | 11 | John | 1 | | 12 | Beth | 1 | |--------+----------+----------| 报告

好的,这是我的三张桌子:

用户

|--------+----------+----------|
| UserID | UserName | IsActive |
|--------+----------+----------|
|   10   |   Mike   |     1    |
|   11   |   John   |     1    |
|   12   |   Beth   |     1    |
|--------+----------+----------|
报告分发版(链接表)

报告

|----------+------------+---------------|
| ReportID | ReportName | Distributable |
|----------+------------+---------------|
|    50    |   FY2010   |       1       |
|    51    |   FY2011   |       1       |
|    52    |   FY2012   |       1       |
|----------+------------+---------------|
在我面临的问题中,我有来自用户表的200个活动用户和来自报告表的10个可分发报告。对于每个用户,我需要显示用户名、报告名称以及是否应将该报告分发给用户,如下所示:

|----------+------------+---------------|
| UserName | ReportName | DistribToUser |
|----------+------------+---------------|
|   Mike   |   FY2010   |       1       |
|   Beth   |   FY2012   |       0       |
|----------+------------+---------------|
我试图实现的是2000个结果的列表(200个用户x 10个报告)。问题在于,REPORT\u DISTRIB链接表并没有针对每个报告的每个用户的记录。我仍然觉得这应该是可能的。。。我的想法错了吗?非常感谢您的帮助

这很粗糙,但这是我到目前为止的查询(返回1790个结果):


因此,我正确地理解您希望为每200个用户返回10行,为每个用户的每个报告返回1行。如果该用户具有与该报表的链接记录,则在另一种情况下输入1,然后输入0?这是指向交叉连接信息的链接。。交叉联接将返回所有可能的组合。然后,您留下了将结果与您需要的其他数据(在本例中为DistribToUser)连接起来的结果哇!谢谢你,乔!我想我可能需要做交叉连接,但我不知道如何使用它。我在WHERE子句中又添加了一个条件(r.Distributable=1),它就像一个符咒!
|----------+------------+---------------|
| UserName | ReportName | DistribToUser |
|----------+------------+---------------|
|   Mike   |   FY2010   |       1       |
|   Beth   |   FY2012   |       0       |
|----------+------------+---------------|
SELECT u.UserName, r.ReportName, rd.DistribToUser
FROM USER u
LEFT JOIN REPORT_DISTRIB rd on rd.UserID = u.UserID
  and rd.ReportID in (select r.ReportID from REPORT r where r.Distributable = 1)
OUTER APPLY (select r.ReportName from REPORT r where r.ReportID = rd.ReportID) r
WHERE u.IsActive = 1
SELECT u.UserName, r.ReportName, COALESCE(rd.DistribToUser, 0)
    FROM USER u
        CROSS JOIN REPORT r
        LEFT JOIN REPORT_DISTRIB rd
            ON u.UserID = rd.UserID
                AND r.ReportID = rd.ReportID
    WHERE u.IsActive = 1
        AND r.Distributable = 1