2012-01-12 2 views
1

Хорошо, так это мои три таблицы:SQL - Как связать две таблицы с третьей таблицы и получить все записи

ПОЛЬЗОВАТЕЛЕЙ

|--------+----------+----------| 
| 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 пользователей x 10 отчетов). Проблема заключается в том, что таблица ссылок REPORT_DISTRIB не имеет записи для каждого пользователя с каждым отчетом. Я все еще чувствую, что это должно быть возможно ... Я ошибаюсь в своих мыслях? Любая помощь приветствуется.

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

+0

Так как я правильно понимаю, что вы хотите, чтобы вернуть 10 строк для каждых 200 пользователей, 1 строку для каждый отчет для каждого пользователя. В случае, если у этого пользователя есть запись связывания с этим отчетом, поставьте 1 в другом случае, положив 0? – Jordan

ответ

3
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 
+1

Вот ссылка на информацию о Cross Joins .. http://www.sqlguides.com/sql_cross_join.php Cross Joins вернет все возможные комбинации. Затем вы оставите свои результаты, используя другие данные (в этом случае DistribToUser) – Scen

+0

Wow! спасибо Джо! Я думал, что мне, возможно, понадобится сделать крест, но я не знал, как его использовать. Я добавил еще одно условие в предложение WHERE (и r.Distributable = 1), и оно работает как шарм! –

Смежные вопросы