如何修改LEFT OUTER JOIN以为右侧表添加过滤器

Sam*_*tar 3 sql sql-server

我的数据库中有三个表.

  • AdminTest - 保存可供用户使用的测试列表
  • AdminTestQuestion - 包含问题列表
  • UserTest - 保存用户已购买的测试列表.此表中有一个UserId列,表中的行始终具有此值.在进行选择时,我需要能够通过UserId过滤掉该表中的行

数据如下所示:

  • 数据库存储三个测试的结果.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
Run Code Online (Sandbox Code Playgroud)

这给我一个这样的报告:

AdminTestId  Title    Questions     Price     PurchaseDate
1            Test1    10            0
2            Test2    20            0         1/1/2011
3            Test3    10            10        2/2/2012
Run Code Online (Sandbox Code Playgroud)

有人可以建议我如何修改它,以便SQL获取一个参数,UserId以便它可以正确显示特定用户购买的测试:

当我为1UserId参数提供值时,我希望看到这一点:

AdminTestId  Title    Questions     Price     PurchaseDate
1            Test1    10            0
2            Test2    20            0         1/1/2011  
3            Test3    10            10     
Run Code Online (Sandbox Code Playgroud)

当我为2UserId参数提供值时,我希望看到这一点:

AdminTestId  Title    Questions     Price     PurchaseDate
1            Test1    10            0
2            Test2    20            0         
3            Test3    10            10        2/2/2012
Run Code Online (Sandbox Code Playgroud)

到目前为止我所尝试的是将UserId的WHERE子句添加到select的AdminUser部分.但这似乎不起作用.我希望有人能指出我正确的方向.

这里是参考UserTest表的DDL,我想以某种方式用UserId过滤掉:

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)
);
Run Code Online (Sandbox Code Playgroud)

gui*_*nty 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
Run Code Online (Sandbox Code Playgroud)