嵌套SQL语句(简单)
我正在尝试运行一个查询,以获取订购产品p01和p07的客户ID(cid) 以下是我认为有效的方法,但没有任何回报:嵌套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
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查看我答案的最新编辑