2011-08-29 66 views
2

我试图获得所有订单中类型A的商品在订单上的所有订单,但类型B的商品不在订单上。不幸的是,表结构有一些缺陷,这使得这比我想象的要困难一些。SQL选择两个特定项目在同一日期不销售给同一客户的地方

数据库问题:
-没有“订单”表,只有一个“Order_Lines”表。但是,我可以假设具有相同“OrderDate”字段和相同客户(见下文)的任何Order_Lines都是同一订单的一部分。

- 为每个交易创建一个新的“客户”记录(yikes!),因此“CustID”字段没有用处。但是,我可以假设任何具有相同“名字”和“姓氏”的客户都是相同的。

DB布局:

Order_Lines: 
OrderLineID CustID ProductID  OrderDate 
----------- ----- ----------- ---------- 
10   5  50    2011-08-01 
20   6  60    2011-08-01 
30   7  50    2011-08-02 
40   8  55    2011-08-03 
50   9  70    2011-08-03 

Customer: 
CustID FirstName LastName 
----- --------- --------- 
5  Bill  Smith 
6  Bill  Smith 
7  Roger  Wilcock 
8  Rudiger  Fensterbottom 
9  Sam   Williams 

ProductTypes: 
ProductID ProductType 
--------- ----------- 
50   Kite 
55   Kite 
60   Yo-Yo 
70   Yo-Yo 

我想获得的所有订单,其中风筝被命令,但溜溜球都是不一样的顺序。在这种情况下,我的结果集为:

ProductID OrderDate FirstName LastName 
--------- --------- --------- -------- 
50   2011-08-02 Roger  Wilcock 
55   2011-08-03 Rudiger  Fensterbottom 
+0

我怎么没看到'Order_Lines'与'Customer'表有关。你确定'Order_Lines'中没有'CustID'字段吗? – RedFilter

+0

哦,我想'PatID' ='CustID'? – RedFilter

+0

对不起,是的,PatID = CustID –

回答

1
SELECT 
    OL1.* 
FROM 
    Order_Lines OL1 
INNER JOIN Product_Types PT1 ON 
    PT1.product_id = OL1.product_id AND 
    PT1.product_type = 'Kite' 
INNER JOIN Customers C1 ON 
    C1.customer_id = OL1.customer_id 
WHERE 
    NOT EXISTS (
     SELECT * 
     FROM Order_Lines OL2 
     INNER JOIN Product_Types PT2 ON 
      PT2.product_id = OL2.product_id 
     INNER JOIN Customers C2 ON 
      C2.customer_id = Order_Lines.customer_id AND 
      C2.first_name = C1.first_name AND 
      C2.last_name = C1.last_name 
     WHERE 
      OL2.order_date = OL1.order_date AND 
      PT2.product_type = 'Yo-Yo') 
+0

谢谢汤姆!你达人!这花了2分钟来运行50k记录。另外两种解决方案都在10分钟后抛出超时错误。 –

1

以下是基本知识。我会去Exists。我的意图是展示一个概念,而不是为你写完整的代码。

Select 
* 
From 
OrderLines as OL 
Where 
Exists (Select * from OrderLines as OL2 where OL2.ProductID = 50 and OL2.PatID = OL.PatID and OL2.OrderDate = OL.OrderDate) -- Has ProductID: 50 
and NOT Exists (Select * from OrderLines as OL3 where OL3.ProductID = 60 and OL3.PatID = OL.PatID and OL3.OrderDate = OL.OrderDate) -- Does not have ProductID: 60 
  • 假设的SQL Server
  • 您需要添加连接到客户表上的名称。为了简单起见,我使用了PatID。
  • 您还需要添加连接到PROD上名称的产品表,如果你不知道PROD A的ID和PROD乙
+0

感谢Hamlin。这是一个非常明确的方法,特别是需要很多连接。 –

相关问题