TSQL查找未选中的项目

时间:2017-12-01 14:28:22

标签: sql sql-server tsql

我目前的数据如表A所示。

Title_1 | Contract A
Title_1 | Contract B
Title_1 | Contract C
Title_2 | Contract A
Title_2 | Contract D

我正在使用

SELECT DISTINCT T2.Title, SUBSTRING(
               SELECT '; ' + Contract as [text()]
               FROM dbo.TitleContracts T1
               WHERE T1.Title = T2.Title
               AND Contract IN (
                  SELECT Contract FROM dbo.ValidContracts
                  )
               FOR XML PATH ('')
           ), 2, 1000) [ContractList]
FROM dbo.TitleContracts T2

以上查询将数据转换为以下结果。然而,我还想做的是使用未选择的ValidContracts表找到每个标题的合同列表。因此,如果我们有合同A-D,则Title_1将返回合同D,而Title_2将返回合同B&合同C.

Title_1 | Contract A; Contract B; Contract C
Title_2 | Contract A; Contract D

我可能会想到这一点,但我所尝试过的任何事情似乎都没有把我带到正确的方向。我并没有要求你编写我的代码,但是向正确的方向推进将是惊人的。

2 个答案:

答案 0 :(得分:2)

好的,不要使用IN来查看ValidContracts,而是对它进行RIGHT JOIN,并过滤左侧为NULL的行。

答案 1 :(得分:1)

使用CTE:

SELECT DISTINCT (user_id) user_id, a.value  
 FROM user_reg ap 
 JOIN user_extra a USING (user_id) 
WHERE ap.session_date BETWEEN '2017-01-01' AND '2017-06-10' AND a.session_date<='2017-01-01'