SQL选择不在同一日期销售给同一客户的两个特定项目

SQL选择不在同一日期销售给同一客户的两个特定项目,sql,pervasive,Sql,Pervasive,我正在尝试获取订单上有A类项目,但订单上没有B类项目的所有订单。不幸的是,表结构有一些缺陷,这使得这比我想象的要困难一些 数据库问题: -没有“订单”表,只有“订单行”表。但是,我可以假设任何具有相同“OrderDate”字段和相同客户(见下文)的订单行都是同一订单的一部分 -每一笔交易都会创建一个新的“客户”记录(yikes!),因此“CustID”字段是无用的。但是,我可以假设任何拥有相同“名字”和“姓氏”的客户都是相同的 数据库布局: 我想得到所有订购风筝的订单,但溜溜球的订单不一样。在这

我正在尝试获取订单上有A类项目,但订单上没有B类项目的所有订单。不幸的是,表结构有一些缺陷,这使得这比我想象的要困难一些

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

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

数据库布局:

我想得到所有订购风筝的订单,但溜溜球的订单不一样。在这种情况下,我的结果集是:

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

这里是基本的。我会选择
存在
。我的意图是演示一个概念,而不是为您编写完整的代码

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
  • 您需要将联接添加到Name上的Customer表中。为了简单起见,我使用了帕蒂
  • 如果您不知道Prod A和Prod B的ID,那么还需要将连接添加到Prod Name上的product表中

我看不出
订单行
客户
表有什么关系。你确定订单行中没有客户ID字段吗?哦,我想是客户ID,谢谢汤姆!你这个男人!这需要2分钟才能在50k记录上运行。其他两个解决方案都在10分钟后抛出超时错误。谢谢Hamlin。这是一个非常明确的方法,尤其是在需要许多连接的情况下。
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
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')