2012-01-12 67 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表的可分發報告。對於每一個用戶,我需要顯示的用戶名,報告名稱,以及該報告是否應分發給用戶,就像這樣:

​​

我試圖做到的,是2000年的結果列表( 200個用戶×10個報告)。問題是REPORT_DISTRIB鏈接表沒有每個用戶對每個報表的記錄。我仍然覺得這應該是可能的...我錯在我的想法?任何幫助是極大的讚賞。

它的粗糙,但是這是我的查詢到目前爲止(返回1790個結果):

+0

所以要我正確理解你想回到10行對每個200個用戶,1個一行每個用戶的報告。在該用戶具有該報告的鏈接記錄的情況下,在另一個情況下將1放置0? – Jordan 2012-01-12 19:48:14

回答

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

以下是有關交叉連接信息的鏈接。http://www.sqlguides.com/sql_cross_join.php交叉連接將返回所有可能的組合。然後,您將其結果與您需要的其他數據(在本例中爲DistribToUser)加在一起。 – Scen 2012-01-12 19:50:22

+0

哇!感謝喬!我想我可能需要做一個交叉連接,但我不知道如何使用它。我在WHERE子句中增加了一個條件(和r.Distributable = 1),它就像一個魅力! – 2012-01-12 19:59:11

相關問題