2017-07-14 133 views
0

我正在尝试获取所有未在前一年下订单的客户ID。我解决这个问题的逻辑就是做一个像下面这样的自我留下的约翰。使用SQL Server中的自加入获取新客户ID

SELECT distinct t1.[CustomerID] 
FROM [AdventureWorks2008].[Sales].[SalesOrderHeader] t1 
    LEFT JOIN [AdventureWorks2008].[Sales].[SalesOrderHeader] t2 
    on t1.CustomerID = t2.CustomerID 
Where 
    t1.OrderDate >= '20040101' 
    and t2.OrderDate > '20030101' 
    and t2.OrderDate <= '20031231' 
    and t2.customerID is null 

但它返回一个空集。 我在这里错过了什么?

+0

当你使用一张左表加入到哪里的条件时,你正在有效地将左连接变成内部。将t2.OrderDate条件从WHERE移动到JOIN,就像在Tim Biegeleisen的回答中一样,或者像在fen1x的回答/ –

回答

1

移动WHERE条件的ON条款:

SELECT distinct t1.[CustomerID] 
FROM [AdventureWorks2008].[Sales].[SalesOrderHeader] t1 
LEFT JOIN [AdventureWorks2008].[Sales].[SalesOrderHeader] t2 
    ON t1.CustomerID = t2.CustomerID AND 
     t1.OrderDate >= '20040101' AND 
     t2.OrderDate BETWEEN '20030101' AND '20031231' 
WHERE t2.customerID IS NULL 

你原来的查询是有点矛盾的,因为从去年匹配的记录将永远NULL

2

使用not exists

SELECT distinct t1.[CustomerID] 
FROM [AdventureWorks2008].[Sales].[SalesOrderHeader] t1 
WHERE not exists (
     select 1 
     from [AdventureWorks2008].[Sales].[SalesOrderHeader] t2 
     where t1.customerID = t2.customerID 
      and t2.OrderDate > '20030101' 
      and t2.OrderDate <= '20031231' 
    ) 
+0

中那样使用EXISTS,并且在外部WHERE中使用AND t1.OrderDate> ='20040101' –

0

我们的资料很少,以解决您的查询问题。

你可以给我们你的表格描述吗?

唯一可能的问题,我在where子句:

Where 
    t1.OrderDate >= '20040101' 
    and t2.OrderDate > '20030101' 
    and t2.OrderDate <= '20031231' 
    and t2.customerID is null 

我想订购日期的时间间隔应该从两个光标一样的,是不是? 这种尝试where子句:

Where 
    t1.OrderDate >= '20030101' 
    and t2.OrderDate > '20030101' 
    and t2.OrderDate <= '20031231' 
    and t2.customerID is null