使用WHERE IN(列表)

时间:2017-06-22 15:09:41

标签: sql postgresql

考虑到我有三张桌子:

  • 产品
  • 供应商

及其联结表:

  • product_shop
  • product_supplier

我正在尝试获取由特定供应商提供并在多个商店中提供的所有产品,即来自供应商A的所有产品,分别位于商店1和2中。

如果我们假设,供应商有10个产品,其中5个在商店1中可用,7个在商店2中可用,但在商店1和2中只有3个,那么这些是我正在寻找的3个。

这是我到目前为止(postgresql 9.6)中的模拟包含IN的内容。哪个有效,但它对我来说似乎不对(正确):

修改 我动态地使用这个查询,并因此传递商店列表(变化),供应商当然和计数(等于商店列表的长度)。这不是一个麻烦,但我仍然想知道是否有办法只使用连接创建一个查询。

 SELECT
    product_shop.product
FROM
    (SELECT product FROM product_shop where shop in (1, 2)) product_shop JOIN
    product_supplier ON product_shop.product = product_supplier.product 
WHERE
    product_supplier.supplier = A
GROUP BY
    product_shop.product
HAVING
    count(product_shop.product) = 2

有没有更好的查询来实现我正在寻找的结果?

  

*不是母语人士

2 个答案:

答案 0 :(得分:0)

我相信这会给你想要的结果

SELECT product.* FROM product
    JOIN product_supplier ON product.id = product_supplier.productId
    JOIN product_shop ON product.id = product_shop.productId
WHERE product_shop.shopId  IN (1 , 2) 
    AND product_supplier.supplierId = 'A'
GROUP BY product.id
    HAVING COUNT(product.id) > 1

它基本相同,但你不需要子查询。但是,有一个错误。 通过您的查询,您将只获得2个商店中可用的产品。 既然你写了:

I am trying to get all products that are supplied by a specific supplier and available in multiple shops

使用HAVING COUNT(product.id) > 1会更通用和正确。 但是,在这种情况下它不会有任何区别,因为您将搜索限制在2个商店。

我还将product_supplier.supplier等引用更改为product_supplier.supplierId。您使用Id字段表示关系。

答案 1 :(得分:0)

这是没有计数的查询

with cte_product -- fetching all the products which are in shop 1&2
(
   SELECT product,count(product) as cnt FROM product_shop 
    where shop in (1, 2) 
    group by product
)
SELECT * 
FROM
    cte_product psh
JOIN
    product_supplier psu 
ON psh.product = psu.product 
WHERE
    psu.supplier = A
and psh.cnt > 1;