SQL Server:在另一个表中选择具有所有指定值的行

时间:2015-02-28 18:36:26

标签: sql sql-server

我有两个表ProductsKeywords,由公共ID加入。

PRODUCTS                                KEYWORDS

Prod_id    Prod_name                    Prod_id    Keyword
--------------------                    ------------------
      1    Broccoli                           1    kw1
      2    Caulifower                         1    kw2
      3    Leek                               2    kw1
      4    Spinach                            2    kw3
      5    Zucchini                           2    kw4
                                              3    kw1
                                              3    kw2
                                              3    kw4
                                              4    kw2
                                              4    kw3
                                              4    kw4

如何仅选择同时具有' kw1'和' kw2' (可能有其他)分配?在上面的例子中,将是Broccoli和Leek。所需关键字列表可以长于两个。这可能是微不足道的,但我无法找到实现这一目标的方法。

如果我这样做

SELECT 
    Prod_id 
FROM 
    products p
JOIN 
    keywords k ON p.prod_id = k.prod_id
WHERE 
    keyword IN ('kw1', 'kw2')

它选择' kw1'或者' kw2' (正如预期的那样)但我需要' kw1' AND ' kw2'。

4 个答案:

答案 0 :(得分:2)

首先,如果您只想要products,则似乎不需要id表。然后,您可以通过在查询中添加group byhaving子句来执行您想要的操作:

SELECT k.Prod_id
FROM keywords k
WHERE k.keyword IN ('kw1' ,'kw2')
GROUP BY k.Prod_id
HAVING COUNT(DISTINCT k.keyword) = 2;

答案 1 :(得分:2)

使用此:

select * from Keywords 
where Keyword = 'kw1' and Prod_id in(
    select Prod_id from Keywords where Keyword = 'kw2'
)

答案 2 :(得分:1)

如果只有几个关键字,那么您可以通过以下方式进行搜索:

SELECT Prod_id FROM products p
where exists (select 1 from keywords 
    where p.prod_id = k.prod_id and keyword = 'kw1') and
exists (select 1 from keywords 
    where p.prod_id = k.prod_id and keyword = 'kw2')

答案 3 :(得分:1)

这应该可以解决问题:

SELECT p.prod_id
  FROM products p INNER JOIN keywords k
    ON p.prod_id = k.prod_id
 WHERE k.keyword IN ('kw1','kw2')
 GROUP BY p.prod_id
HAVING COUNT(*) = 2;

另一种选择是使用WHERE EXISTS,但我觉得有点笨拙,因为在这种情况下需要两个子查询。