2016-07-26 54 views
0

假设这些表:SQL WHERE子句匹配两个(或更多)加盟行

customer with age column 
order with customer_id and item_id column 

我需要一个SELECT语句是这样的:

SELECT ... FROM customer c 
    JOIN order o ON c.id = o.customer_id 
    WHERE c.age > 30 
    AND (c has ordered item_id 1 AND item_id 2) 

有一行对每项订购货物顺序表

+1

请编辑您的问题,并根据该数据添加一些示例数据和预期输出。 _Formatted_文本,请[无屏幕截图](http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on-so-when-asking-a-问题/ 285557#285557) –

回答

2

它将返回谁下令item_id 1 and 2

客户0

样品执行:

CREATE TABLE Customer (Id VARCHAR (200), Age INT); 
INSERT INTO Customer (Id, Age) VALUES (1, 25), (2, 31), (3, 35), (4, 40); 

CREATE TABLE Order (customer_id VARCHAR (200), item_id INT); 
INSERT INTO Order(customer_id, item_id) VALUES 
(1, 1), (1, 2), (2, 1), (2, 2), (3, 1), (4, 2), (4, 1), (4, 3); 

SELECT c.Id 
FROM customer c 
JOIN order o ON c.id = o.customer_id 
WHERE c.age > 30 AND o.item_id IN (1, 2) 
GROUP BY c.Id 
HAVING COUNT(DISTINCT o.item_id) = 2 

结果:

Id 
---- 
2 
4 
+0

@dve答案对您有帮助吗? – Arulkumar

2

最有效的方法可以是:

select c.* 
from customer c 
where c.age > 30 and 
     exists (select 1 from orders o where c.id = o.customer_id and o.item_id = 1) and 
     exists (select 1 from orders o where c.id = o.customer_id and o.item_id = 2) ; 

这可以采取customer(age, id)orders(customer_id, item_id)优势的索引。请注意,将年龄存储在表格中通常是不合理的,因为年龄总是在变化。