我有四个表,即客户,订单,订单详细信息和产品。
客户表
cId cName
1 James
2 Adam
3 Ed
订单表
oId cId
1 1
2 2
3 3
OrderDetails表
oId odId pId Quantity
1 1 1 50
1 2 2 45
2 3 2 52
3 4 1 44
产品表
pId PName
1 Apple
2 Orange
我想要从未订购过Oranges的客户列表。我能够提取订单详细信息没有橙子的客户记录。但在其中一个案例中,詹姆斯已经订购了苹果和橘子。所以,查询不应该拉詹姆斯。我可以用更大的查询来做到这一点。但是我想用一个较小的查询来解决这个问题。
SQL
SELECT c.cId, c.cName, p.PName, od.Quantity FROM customers c
LEFT JOIN orders o ON c.cId = o.cId
LEFT JOIN orderDetails od ON o.oId = od.oId
JOIN products p ON od.pId = p.pId
WHERE od.pId != 2
答案 0 :(得分:3)
我会使用not exists
执行此操作:
with has_oranges as (
select o.*
from orders o join
orderlines ol
on o.oid = ol.oid
where ol.pid = 2
)
select c.*
from customers c
where not exists (select 1
from has_oranges ho
where ho.cid = c.cid
);
如果您需要客户信息,我不会看到oid
与任何事情有什么关系。
注意:
products
表格,因为您使用的是pid
。答案 1 :(得分:2)
使用NOT EXISTS
SELECT *
FROM Customers c
WHERE NOT EXISTS (
SELECT 1 FROM orders o
JOIN orderDetails od ON o.oId = od.oId
JOIN products p ON od.pId = p.pId
WHERE p.pName = 'oranges' AND c.cId = o.cId
)
答案 2 :(得分:1)
您希望所有从未订购橙子的客户。因此,请选择订购橙子的所有客户ID,并仅显示不在此数据集中的客户。
$state.transitionTo($state.current, $stateParams, {
reload: true, inherit: false, notify: true
}); // this is also used to reload the controller and view without page reload.
答案 3 :(得分:0)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<style type="text/css">
.active {
color: red;
}
</style>
<div id="cart">
<a>
<span></span>
<i style="border:1px solid black;">here</i>
</а>
</div>
这将退回未订购Oranges的客户。 这是sqlfiddle链接:http://sqlfiddle.com/#!6/c908d/6
答案 4 :(得分:0)
SQL Server 2008引入了EXCEPT和INTERSECT关键字来执行此类操作。我倾向于发现查询比使用CTE时更清晰。
select c.cId
from Customer c
except
select o.cId
from Orders o
join OrderDetail od on o.oId = od.oId
and od.pId = 2
cId
-----------
3
您可以通过在查询的后半部分加入Customer表来将名称添加到结果集中:
select c.cId, c.cName
from Customer c
except
select o.cId, c.cName
from Orders o
join OrderDetail od on o.oId = od.oId
join Customer c on c.cId = o.cId
and od.pId = 2
cId cName
----------- --------------------
3 Ed
答案 5 :(得分:0)
我们必须消除服用橙色的用户。所以在下面的查询中我使用了子查询
Select C.Cname,OH.oid,PM.Pname,OD.Quantity from Customers C
inner join OrderHeader OH ON C.cid=OH.Cid
inner join OrderDetails OD on oh.oid=od.oid
inner join ProductMast PM on PM.pid=OD.pid where OH.oid not in (select oid
from OrderDetails where pid = 2)