嵌套SQL语句(简单)

嵌套SQL语句(简单),sql,postgresql,Sql,Postgresql,我正在尝试运行一个查询,以获取订购产品p01和p07的客户ID(cid) 以下是我认为有效的方法,但没有任何回报: SELECT cid FROM customers WHERE cid IN (SELECT cid FROM orders WHERE pid IN (SELECT pid FROM products WHERE

我正在尝试运行一个查询,以获取订购产品p01和p07的客户ID(cid)

以下是我认为有效的方法,但没有任何回报:

SELECT cid
FROM customers
WHERE cid IN (SELECT cid
              FROM orders
              WHERE pid IN (SELECT pid
                            FROM products
                            WHERE pid = 'p01'
                            AND pid = 'p07'));

原始查询不会返回任何行,因为

 SELECT pid 
 FROM products
 WHERE pid = 'p01' AND pid = 'p07';
将始终不返回任何行,因为永远不会满足pid='p01'和pid='p07'中的条件

你应该做的是:

SELECT cid
FROM customers
WHERE cid IN (SELECT cid
              FROM orders
              WHERE pid IN (SELECT pid
                            FROM products
                            WHERE pid IN ('p01', 'p07')));
您还可以使用连接:

SELECT DISTINCT C.cid
FROM   customers AS C 
       INNER JOIN 
       orders AS O ON O.cid = C.cid
       INNER JOIN 
       products AS P ON P.pid = O.pid
WHERE   P.pid IN ('p01', 'p07')
如果不想使用DISTINCT,则可以执行以下操作:

SELECT  C.cid
FROM    customers AS C 
WHERE   EXISTS  (SELECT O.cid 
              FROM   orders AS O INNER JOIN 
                     products AS P ON P.pid = O.pid
              WHERE  P.pid IN ('p01', 'p07') AND O.cid = C.cid)
根据您的评论“它返回c001、c004和c006,但客户c004只订购了一种产品(p01),而不是两种产品(p07和p01)”,我认为您需要这样做:

SELECT  C.cid
FROM    customers AS C 
WHERE   EXISTS  (SELECT O.cid 
              FROM   orders AS O INNER JOIN 
                     products AS P ON P.pid = O.pid
              WHERE  P.pid IN ('p07') AND O.cid = C.cid) AND 
        EXISTS (SELECT O.cid 
              FROM   orders AS O INNER JOIN 
                     products AS P ON P.pid = O.pid
              WHERE  P.pid IN ('p01')  AND O.cid = C.cid ) 

pid永远不会同时是
'p01'
'p07'
。使用
,或者仅在中使用

SELECT DISTINCT customers.cid
FROM customers
JOIN orders ON orders.cid = customers.cid
WHERE orders.pid IN ('p01', 'p07')

你不会马上得到你的模式吧?一个
pid
怎么可能同时是
p01
p07
?使用“或”。(…values…
中的
可以看作是
测试的列表。如果产品表中不存在pid值'p01'和/或'P07',该怎么办?@KamranFarzami,那么它只会返回一个空结果set@Ven上面的解决方案如何引用产品表。你是说
join
s?看,我还没有真正深入研究加入。您给出的第一个示例似乎是正确的,但它仍然返回一个只有一个产品(pid)而不是两个产品的cid。@StephenBohner订单表中是否存在pid?是的。它返回c001、c004和c006,但客户c004只订购了其中一种产品(p01),而不是同时订购了两种产品(p07和p01)。@StephenBohner查看我答案的最新编辑