考虑到我有三张桌子:
及其联结表:
我正在尝试获取由特定供应商提供并在多个商店中提供的所有产品,即来自供应商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
有没有更好的查询来实现我正在寻找的结果?
*不是母语人士
答案 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;