2014-10-03 87 views
3

我在我的數據庫中有三個表。如何修改左側外部聯接以爲右側表添加過濾器

  • AdminTest - 持有可供用戶
  • AdminTestQuestion測試列表 - 保存的問題
  • UserTest列表 - 保存用戶所購買的測試列表。這個表中有一個UserId列,表中的行總是有一個值。如果做一個選擇,我需要能夠通過用戶ID

的數據看起來像這樣來過濾掉此表中的行:

  • 數據庫存儲的三個測試結果。 test1,test2和test3
  • userId = 1的人購買了test2
  • userId = 2的人購買了test3。

我使用下面的SQL:

SELECT 
    AdminTest.AdminTestId, 
    AdminTest.Title, 
    COUNT(AdminTestQuestion.AdminTestQuestionId) Questions, 
    AdminTest.Price, 
    UserTest.PurchaseDate 
FROM AdminTest 
    LEFT OUTER JOIN UserTest 
     ON AdminTest.AdminTestId = UserTest.AdminTestId 
    JOIN AdminTestQuestion 
     ON AdminTest.AdminTestId = AdminTestQuestion.AdminTestId 
GROUP BY 
    AdminTest.AdminTestId, 
    AdminTest.Title, 
    UserTest.UserId 

,給了我這樣一個報告:

AdminTestId Title Questions  Price  PurchaseDate 
1   Test1 10   0 
2   Test2 20   0   1/1/2011 
3   Test3 10   10  2/2/2012 

有人建議我怎麼能修改此所以SQL需要的參數UserId所以它可以正確顯示特定用戶購買的測試:

這是什麼我想看到我的userid參數提供的1值:

AdminTestId Title Questions  Price  PurchaseDate 
1   Test1 10   0 
2   Test2 20   0   1/1/2011 
3   Test3 10   10  

這是我想看到我的userid參數提供的2值是什麼:

AdminTestId Title Questions  Price  PurchaseDate 
1   Test1 10   0 
2   Test2 20   0   
3   Test3 10   10  2/2/2012 

我到目前爲止試過的是將UserId的WHERE子句添加到select的AdminUser部分。但這似乎並不奏效。我希望有人能指出我正確的方向。

僅供參考這裏的UserTest表的DDL,我想以某種方式與用戶ID來過濾掉:

CREATE TABLE [dbo].[UserTest] (
    [UserTestId]    INT   IDENTITY (1, 1) NOT NULL, 
    [AdminTestId]    INT   NOT NULL, 
    [UserId]     INT   NOT NULL, 
    [PurchaseDate]   DATETIME  NOT NULL, 
    CONSTRAINT [PK_UserTest] PRIMARY KEY CLUSTERED ([UserTestId] ASC) 
); 
+1

不要使用WHERE子句,請將UserId的篩選器置於LEFT JOIN條件中嗎? – 2014-10-03 13:10:02

+0

@RichardHansell,但我不知道如何在沒有WHERE的情況下過濾 – 2014-10-03 13:13:43

+0

此外,如果您在'LEFT JOIN'旁邊使用'WHERE';您的數據庫引擎會將其視爲「INNER JOIN」。 – Rahul 2014-10-03 13:21:58

回答

5

要什麼@RichardHansell說擴大...

您可以過濾通過添加東西到腳本的「ON」子句JOIN。 ON子句不一定只是兩個表之間的鏈接,您也可以添加其他過濾器。像這樣...

SELECT AdminTest.AdminTestId, 
     AdminTest.Title, 
     COUNT(AdminTestQuestion.AdminTestQuestionId) Questions, 
     AdminTest.Price, 
     UserTest.PurchaseDate 
FROM  AdminTest 
LEFT OUTER JOIN UserTest 
ON  AdminTest.AdminTestId = UserTest.AdminTestId 
AND  UserTest.UserId = @FilteredUserId 
JOIN AdminTestQuestion 
ON  AdminTest.AdminTestId = AdminTestQuestion.AdminTestId 
GROUP BY AdminTest.AdminTestId, AdminTest.Title, UserTest.UserId 
2

如果你把參數測試左外側的ON子句中加入,你應該得到的導致你後:

... 
LEFT OUTER JOIN UserTest 
ON  AdminTest.AdminTestId = UserTest.AdminTestId 
AND  UserTest.UserId = @UserId 
... 
+0

你能舉一個我的SQL例子,這樣我就能明白你的意思了。謝謝 – 2014-10-03 13:14:22

+0

查看更新的答案 – 2014-10-03 13:15:26

相關問題