2012-03-28 29 views
1

我試圖查詢兩個表是一對多關係。 我所做的是創建一個視圖,知道我可能最終得到第一個表的多個記錄。TSQL中相同列的多個WHERE子句

我的場景如下:我有一個表「項目」和表「屬性」。

「屬性」表包含一個ItemsId列,PropertyId,PropertyValueId列。

「Items」表/對象包含「Properties」列表。

我該如何查詢「查看」,這樣我想獲得所有具有「PropertyId」組合的「Items」記錄的「PropertyValueId」值。

換句話說類似於:

 
WHERE 
(PropertyId = @val1 AND PropertyValueId = @val2) OR 
(PropertyId = @val3 AND PropertyValueId = @val4) OR 
(PropertyId = @val5 AND PropertyValueId = @val6) 

WHERE子句僅僅是一個循環結束 「Items.Properties」 集合。

「Items」表示存儲在數據庫中的項目表。每個&每個項目都有一些或多個動態屬性。這就是爲什麼我有另一個名爲「屬性」的表。屬性表包含列: ItemId,PropertyId,PropertyValue

「Item」對象具有Properties/Values集合。 PROP1:VAL1,PROP2:VAL2,等...

感謝

+1

如果他們都是表,你不能只加入使用兩列?你能清楚一下Items表的外觀和val1,val2等是從哪裏來的? – kaj 2012-03-28 08:17:52

+0

謝謝。我更新了上面的文本 – Bill 2012-03-28 11:35:21

+0

我看到有人在SQL中回答,但我假設你正在尋找一個linq查詢?否則,我不明白entity-framework標籤。 – 2012-03-28 20:59:54

回答

0

我可能沒有理解你的需求(儘管更新) - 如果這個或任何其他的答案不能解決問題,請添加一些樣品項目,屬性和輸出的數據,然後希望它變得清楚。

如果項目是您需要的屬性名稱 - 值對的規範(和無關與項目Id上似乎很奇怪屬性...)

select p.itemid 
from properties p 
where exists (select 1 from items i where i.propertyId = p.propertyId and i.propertyValueId = p.propertyValueId) 
group by p.itemid 
having count(distinct p.propertyid) = (select count(*) from items) 

這將返回一組itemids的那對項目中定義的每個屬性都有一個(也是唯一的)屬性值。如果你願意,你可以把物品數量放入一個變量中。

0

我會用這樣的查詢:

SELECT ItemId 
FROM ItemView 
WHERE (PropertyId = @val1 AND PropertyValueId = @val2) 
    OR (PropertyId = @val3 AND PropertyValueId = @val4) 
    OR (PropertyId = @val5 AND PropertyValueId = @val6) 
GROUP BY ItemId 
HAVING COUNT(*) = 3 

WHERE條款是一樣的你的問題,它只允許如果行有一個匹配的屬性來選擇行。您只需要另外確保獲得的項目具有所有過濾器中的屬性,這是在HAVING子句的幫助下在上面的查詢中完成的:您正在請求具有3個特定屬性的項目,因此屬性的數量結果集中的每個項目(COUNT(*))應該等於3.

在更普遍的情況下,當查詢的屬性數量可能是任意的時,您應該考慮以表格形式傳遞參數並加入對它的看法:

… 
FROM ItemView v 
    INNER JOIN RequestedProperties r ON v.PropertyId  = r.Id 
            AND v.PropertyValueId = r.ValueId 
GROUP BY v.ItemId 
HAVING COUNT(*) = (SELECT COUNT(*) FROM RequestedProperties) 
+0

將表傳遞給查詢參數? – Bill 2012-03-28 20:50:25

+0

作爲選項,是的,如果您使用的是支持表值參數的SQL Server 2008+。另一種方法是將列表作爲CSV字符串傳遞,將其與函數拆分成行,然後可能將每個項目拆分爲兩列(屬性ID和屬性值ID)。或者,也許你可以事先準備一個包含所需屬性的臨時表,並在查詢中使用該表。 (因此,您會隱式傳遞參數,這可能會或可能不會是一個好主意,具體取決於您的情況。) – 2012-03-28 22:35:37