我在我的數據庫中有三個表。如何修改左側外部聯接以爲右側表添加過濾器
- 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)
);
不要使用WHERE子句,請將UserId的篩選器置於LEFT JOIN條件中嗎? – 2014-10-03 13:10:02
@RichardHansell,但我不知道如何在沒有WHERE的情況下過濾 – 2014-10-03 13:13:43
此外,如果您在'LEFT JOIN'旁邊使用'WHERE';您的數據庫引擎會將其視爲「INNER JOIN」。 – Rahul 2014-10-03 13:21:58