Sql 查询和不查询或使用WHERE IN(列表)
考虑到我有三张桌子:Sql 查询和不查询或使用WHERE IN(列表),sql,postgresql,Sql,Postgresql,考虑到我有三张桌子: 产品 商店 供应商 以及它们的连接表: 商品店 产品供应商 我正在尝试获取由特定供应商提供并可在多个车间获得的所有产品,即供应商a在车间1和车间2提供的所有产品 如果我们假设供应商有10种产品,其中1号店有5种,2号店有7种,但1号店和2号店只有3种,那么这些就是我正在寻找的3种 以下是我到目前为止(在postgresql9.6中)所做的,它模拟了一个inclusive in。这是可行的,但对我来说似乎不合适: 编辑: 我动态地使用这个查询,因此必须传递商店列表(不
- 产品
- 商店
- 供应商
- 商品店
- 产品供应商
postgresql9.6
中)所做的,它模拟了一个inclusive 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
是否有更好的查询来实现我所寻求的结果
*不是以英语为母语的人
我相信这会给你想要的结果
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
使用将COUNT(product.id)>1
更通用、更正确。
但是,在这种情况下没有任何区别,因为您将搜索限制为2家店铺
我还将诸如
product\u supplier.supplier
之类的引用更改为product\u supplier.supplierId
。您可以将Id字段用于表关系。以下是不包含计数的查询
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;
“更好的查询”是什么意思?@GordonLinoff,如果可能的话,让计数删除所有重复项是我想避免的额外步骤。是的,recursiv是个好主意。然而,使用这个特定的查询,我得到一个psh上不存在的
42703列。然而,商店列表的长度是不同的。从哪里可以得到商店列表?您是否需要来自特定店铺列表的产品,或者您是否需要来自应用程序端的多个店铺列表中的产品。我需要所有商店里的所有产品。也就是说,车间列表各不相同(内容和长度),根据该列表,我需要车间1、2和3中的所有产品……如果可能,将该列表加载到temp表中,并与CTE中的product_车间表连接,或者提供车间列表加载处的应用程序端代码