2017-02-17 88 views
0

說我有一個表稱爲#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 

如果列表中的值存在於Food Table中,我想返回記錄。

所以我有這樣的:

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 

... 

本質返回記錄,如果在列表中的項目對應於我指定的領域之一。我知道蘋果可能會有「重複」的記錄是「蘋果」和「綠色」,我想要。

但是,我也希望能夠將包含標誌切換爲0並返回ListTable中與Food中的任何字段都不匹配的項目。

我將如何返回不匹配的證券列表?我知道有類似的問題,但我很難找出多場比較案例。

感謝

+0

使用存儲過程與'IF ... ELSE處理'InclusionFlag' ... '。然後寫每個列的適當查詢 –

+0

我明白這一點。我只是遇到了其他部分 – user3697498

回答

1

您可以使用cross apply()先UNPIVOT您的數據,然後用case表達when exists()where子句返回0,或者當它的存在和比較,爲@InclusionFlag 1。

;with FoodItem as (
    select x.Item 
    from food as f 
    cross apply (values (Fruit),(Vegetable),(Dairy),(Color)) as x (Item) 
    where x.Item is not null 
    and f.Date = @Date 
) 

select 
    lt.Item 
from ListTable as lt 
where case when exists (
    select 1 
    from FoodItem fi 
    where lt.Item = fi.Item 
) then 1 else 0 end = @InclusionFlag 
+0

問題,你可以改變,所以當你有一場比賽時,你從食物表而不是列表中返回行嗎? – user3697498

+0

nvm不要擔心...我知道了 – user3697498

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 
+0

這將顯示'綠色'兩次從'#ListTable'的單個項目# – SqlZim

+0

@Serg我正在測試你的現在......在返回「重複列」方面,如果我在我的列表中有「綠色」和「蘋果」,我應該在結果中兩次返回食品表中的第一行。你是否這樣做 – user3697498

+0

@SqlZim SELECT DISTINCT F. * ..以避免雙打。 – Serg