2017-07-14 136 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