2014-11-05 20 views
0

代碼中的問題:SQL:打開一個IN到與替代或者

...and crset.Name IN (Select [part] from [dbo].[SplitString](@Type, ',')... 

假設@Type'Blue,White'和splitstring功能,讓我把這個字符串到一個列表中,使用IN。

目前這返回所有藍色或白色的條目,讓我們說房子的顏色。我想要的是這樣一種說法:「只有那些顏色在列表中並且必須具有列表中所有顏色的房屋這意味着每個房屋都有多個條目:每個顏色具有一個條目(這就是數據庫中的情況),這意味着有「紅色」和「白色」條目的房屋不會出現,只有「藍色」條目不會顯示,「白色」條目不會顯示,但其中有多個記錄(藍,白)會的。任何房屋

讓我知道如果你需要更多的代碼來工作。

回答

3

我會用CTE做到這一點:

with vals as (
     Select part from [dbo].[SplitString](@Type, ',') 
    ) 
select t.house 
from table t 
where t.color in (select part from vals) 
group by t.house 
having count(distinct t.color) = (select distinct part from vals); 

如果你想比賽限制在確切顏色,然後取出where條款。

+1

內部連接是否比'in'子句快? – 2014-11-05 20:32:30

+0

一個小問題「。一個聚合可能不會出現在WHERE子句中,除非它位於包含在HAVING子句或選擇列表中的子查詢中,並且聚合的列是外部引用。」 或者如果我把它我真的認爲它應該是: 聚合不能出現在ON子句中,除非它在子查詢中包含在HAVING子句或選擇列表,並且被聚合的列是外部引用。 更需要編碼嗎? – MetalPhoenix 2014-11-05 20:37:56

+1

@MetalPhoenix。 。 。您需要重寫整個查詢以遵循此方法。你不能只在'where'子句中過濾來做你想做的事情,因爲它會影響多行。 – 2014-11-05 22:08:51

2
select house 
from crset 
where crset.Name IN (Select [part] from [dbo].[SplitString](@Type, ',')) 
group by house 
having count(distinct crset.Name) = (Select count([part]) from [dbo].[SplitString](@Type, ',')) 

如果有許多顏色可以由house組和計數對於他們來說,就像你提供的清單一樣。如果是這樣,那麼所有的t他爲您在列表中的where條件中過濾顏色。

+0

謝謝。我可以看到這是怎麼回事,我看到這可能是票據,但是我得到了「選擇'附近的語法不正確(等號後)(即使我把它放在新的查詢中)。 ? – MetalPhoenix 2014-11-05 20:13:53

+1

我更新了答案,您需要將select放入括號中。 – 2014-11-05 20:19:03

+1

您可以通過高級解釋您的SQL來提高答案的質量。 – 2014-11-05 20:24:29