基于多个字段比较比较两个表并返回不存在的行

时间:2017-02-17 16:22:53

标签: sql sql-server

假设我有一个名为 #ListTable 的表:

Item:
Apple
Bannana
Pea
Milk
Green

另一张表食物类似于:

Date       Fruit       Vegetable      Dairy       Color
2/16/17    Apple       NULL           NULL        Green
2/16/17    NULL        Pea            NULL        Green
2/16/17    NULL        NULL           Milk        White

如果列表中的值存在于食物表中,我想返回记录。

所以我有类似的东西:

DECLARE @Date = '2/16/17',
@InclusionFlag = 1

SELECT *
FROM Food F
INNER JOIN #ListTable LT1
ON F.Fruit = LT1.Item
WHERE Date = @Date

UNION ALL

SELECT *
FROM Food F
INNER JOIN #ListTable LT2
ON F.Color = LT1.Item
WHERE Date = @Date

...

如果List中的项目对应于我指定的某个字段,则基本上返回记录。我知道可能有重复的#34;记录像Apple正在" Apple"和"格林"我想要那个。

但是,我还希望能够将包含标记切换为0并返回ListTable中与Food中的任何字段不匹配的项目。

我如何退回不匹配的证券清单?我知道有类似的问题,但我无法在多场比较案例中找出它。

由于

2 个答案:

答案 0 :(得分:1)

您可以先使用 cross apply() 取消数据,然后在case子句中使用带有when exists()的{​​{1}}表达式返回0或者存在时为1,并将其与where进行比较。

@InclusionFlag

答案 1 :(得分:0)

如果我做对了,食物行(可能重复)匹配#ListTable

SELECT F.*
FROM Food F
INNER JOIN #ListTable LT1
ON LT1.Item IN (F.Fruit, F.Vegetable, F.Dairy, F.Color)
WHERE Date = @Date