2017-09-19 12 views
1

私は4つのテーブル、すなわちcustomers、orders、orderDetails、Productsを持っています。SQL:注文の詳細に基づいて特定の注文を引き出す方法は?

Customerテーブル

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 

Productsテーブル

pId PName 
1 Apple 
2 Orange 

オレンジを注文したことのないお客様のリストが必要です。注文の詳細にオレンジが付いていない顧客のレコードを引き出すことができます。しかし、この事件の1つでは、ジェームスはリンゴとオレンジの両方を注文しました。だから、クエスチョンはジェームズを引き寄せてはならない。私はより大きなクエリでこれを行うことができます。しかし、私は何かが不足している場合は、これをより小さいクエリで欲しい。

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

WHERE句は、2番目のLEFT JOINを通常のINNER JOINとして動作させます。 – jarlh

答えて

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が実際にオレンジを持っているユーザーを決定。
  • pidを使用しているため、productsテーブルは必要ありません。
+0

作業中!ありがとうございました – Madhukar

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 
) 
+0

エラーが発生しています。明示的な結合が暗黙的な結合より優先されると思います。 – Madhukar

+0

@madhukarあなたはエラーを投稿できますか? –

+0

あなたのSQLは顧客テーブルのすべてのレコードを引っ張っています。 ( 'Select * from customers'に相当) – Madhukar

0
select * from CustomerTbl where Id in (select t1.Id from CustomerTbl t1 
left join OrderTbl t2 on t1.Id = t2.CustomerId 
left join OrderDetailTbl t3 on t3.OrderId = t2.Id 
left join ProductTbl t4 on t4.Id = t3.ProductId 
where t4.Id != 2) 

これはオレンジを命じていないお客様を返します。 これはsqlfiddleリンクです。http://sqlfiddle.com/#!6/c908d/6

1

オレンジを注文したことのないすべての顧客が必要です。したがって、注文したオレンジ色の顧客IDをすべて選択し、このデータセットにない顧客のみを表示します。

select * 
from customers c 
where cid not in 
(
    select cid 
    from orderdetails 
    where pid = (select pid from products where pname = 'Orange' 
); 
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 
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) 
関連する問題