SQL:如何根据订单详细信息提取特定订单?

时间:2017-09-19 10:51:43

标签: sql sql-server sql-server-2008

我有四个表,即客户,订单,订单详细信息和产品。

客户表

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

6 个答案:

答案 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与任何事情有什么关系。

注意:

  • CTE确定谁实际上有橘子。
  • 您不需要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时更清晰。

Microsoft Documentation

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)