Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 查询和不查询或使用WHERE IN(列表)_Sql_Postgresql - Fatal编程技术网

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。这是可行的,但对我来说似乎不合适: 编辑: 我动态地使用这个查询,因此必须传递商店列表(不

考虑到我有三张桌子:

  • 产品
  • 商店
  • 供应商
以及它们的连接表:

  • 商品店
  • 产品供应商
我正在尝试获取由特定供应商提供并可在多个车间获得的所有产品,即供应商a在车间1和车间2提供的所有产品

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

以下是我到目前为止(在
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_车间表连接,或者提供车间列表加载处的应用程序端代码