2015-10-13 28 views
0

返回重複行我有一個表像SQL特定值

product_id  tag_id value 

1     1   10 
1     2   51 
1     3   47 
2     1   15 
2     2   59 
2     3   44 
3     1   10 
3     2   51 
3     3   47 
4     1   10 
4     2   12 
4     3   55 

我想創建查詢,返回不同的產品ID的滿足所有三個標籤ID的具體指標分析。

例如,我想已經TAG_ID 1 = 10和TAG_ID 2 = 51和TAG_ID 3 = 47

Thnks

回答

0

無論是產品ID的做GROUP BY,使用HAVING,以確保所有3種不同包含tag_id/value組合。

SELECT product_id 
FROM tablename 
WHERE (tag_id = 1 AND value = 10) 
    OR (tag_id = 2 AND value = 51) 
    OR (tag_id = 3 AND value = 47) 
group by product_id 
having count(distinct tag_id) >= 3 

或者說,一個雙自聯接:

select distinct t1.product_id 
from 
    (select product_id from tablename where tag_id = 1 AND value = 10) t1 
join 
    (select product_id from tablename where tag_id = 2 AND value = 51) t2 on t1.product_id = t2.product_id 
join 
    (select product_id from tablename where tag_id = 3 AND value = 47) t3 on t2.product_id = t3.product_id 
+0

我已經添加到第一個帖子另一個product_id顯示我想要的...在我的情況產品1,3,4有tag_id 1 = 10。與上面的代碼,所有三他們將被查詢返回。我真正想要的是查詢返回產品id的所有三個tag_id是相同的!在我的情況下,產品1和3! –

1

這是使用HAVING通常做:

SELECT product_id 
FROM tablename 
WHERE (tag_id = 1 AND value = 10) 
    OR (tag_id = 2 AND value = 51) 
    OR (tag_id = 3 AND value = 47) 
GROUP BY product_id 
    HAVING COUNT(*) = 3 -- number of searched combinations 

這假設組合tag_id/value是唯一的,否則你有改變計數添加一個明顯的像COUNT(DISTINCT tag_id)

+0

我已經添加到第一篇文章另一個product_id顯示我想要的...在我的情況下,產品1,3,4 tag_id 1 = 10。與上面的代碼,他們三個將由查詢返回。我真正想要的是查詢返回產品id的所有三個tag_id是相同的!在我的情況下,產品1和3! –

+0

@GeorgeGirgolas:你真的運行過查詢(或者jarlh's?或者Backs?),它們都會按照你的意願返回。 – dnoeth

0

爲了減少失誤我prefere到descripe在單獨的表這樣的條件下,加入到目標表:

DECLARE @Products TABLE (product_id int, tag_id int, value int) 

INSERT INTO @Products 
VALUES 
(1,     1,   10), 
(1,     2,   51), 
(1,     3,   47), 
(2,     1,   15), 
(2,     2,   59), 
(2,     3,   44), 
(3,     1,   10), 
(3,     2,   51), 
(3,     3,   47), 
(4,     1,   10), 
(4,     2,   12), 
(4,     3,   55) 

DECLARE @Conditions TABLE (tag_id int, value int) 
INSERT INTO @Conditions 
VALUES 
(1, 10), 
(2, 51), 
(3, 47) 


SELECT p.product_id 
FROM @Products p 
INNER JOIN @Conditions c ON p.tag_id = c.tag_id AND p.[value] = c.[value] 
GROUP BY p.product_id 
HAVING COUNT(*) = (SELECT COUNT(*) FROM @Conditions c2) 
0

如果你還沒有無盡的可能的組合我寧願以下自然的方法,這也是維護(如果條件越來越多複雜):

SELECT DISTINCT product_id 
FROM dbo.TableName t 
WHERE EXISTS 
(
    SELECT 1 FROM dbo.TableName t1 
    WHERE t1.product_id = t.product_id 
    AND t1.tag_id = 1 
    AND t1.Value = 10 
) 
AND EXISTS 
(
    SELECT 1 FROM dbo.TableName t1 
    WHERE t1.product_id = t.product_id 
    AND t1.tag_id = 2 
    AND t1.Value = 51 
) 
AND EXISTS 
(
    SELECT 1 FROM dbo.TableName t1 
    WHERE t1.product_id = t.product_id 
    AND t1.tag_id = 3 
    AND t1.Value = 47 
)