SQL - Как связать две таблицы с третьей таблицей и получить все записи - PullRequest
1 голос
/ 12 января 2012

Хорошо, вот мои три таблицы:

USER

|--------+----------+----------|
| UserID | UserName | IsActive |
|--------+----------+----------|
|   10   |   Mike   |     1    |
|   11   |   John   |     1    |
|   12   |   Beth   |     1    |
|--------+----------+----------|

REPORT_DISTRIB (таблица ссылок)

|-----------+--------+----------+---------------|
| DistribID | UserID | ReportID | DistribToUser |
|-----------+--------+----------+---------------|
|     1     |   10   |    50    |       1       |
|     2     |   12   |    52    |       0       |
|     3     |   14   |    54    |       1       |
|-----------+--------+----------+---------------|

ОТЧЕТ

|----------+------------+---------------|
| ReportID | ReportName | Distributable |
|----------+------------+---------------|
|    50    |   FY2010   |       1       |
|    51    |   FY2011   |       1       |
|    52    |   FY2012   |       1       |
|----------+------------+---------------|

В проблеме, с которой я сталкиваюсь, у меня есть 200 активных пользователей из таблицы USER и 10 отчетов из таблицы REPORT, которые можно распространять. Для каждого пользователя мне нужно отобразить имя пользователя, имя отчета и то, должен ли этот отчет распространяться среди пользователей, например, так:

|----------+------------+---------------|
| UserName | ReportName | DistribToUser |
|----------+------------+---------------|
|   Mike   |   FY2010   |       1       |
|   Beth   |   FY2012   |       0       |
|----------+------------+---------------|

Я пытаюсь достичь списка результатов 2000 (200 пользователей х 10 отчетов). Проблема заключается в том, что таблица ссылок REPORT_DISTRIB не имеет записи для каждого пользователя с каждым отчетом. Я все еще чувствую, что это возможно ... я ошибаюсь в своих мыслях? Любая помощь с благодарностью.

Это грубо, но это мой запрос (который возвращает 1790 результатов):

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

1 Ответ

3 голосов
/ 12 января 2012
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...