在 SQL 服务器中使用自我加入获取新的 CustomerID
Get New CustomerID using Self Join in 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
但它 returns 是一个空集。
我在这里错过了什么?
使用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'
)
我们没有多少信息可以解决您的查询问题。
你能给我们描述一下你的桌子吗?
where 子句中唯一可能出现的问题:
Where
t1.OrderDate >= '20040101'
and t2.OrderDate > '20030101'
and t2.OrderDate <= '20031231'
and t2.customerID is null
我想两个游标的 OrderDate 间隔应该相同,不是吗?
试试这个 where 子句:
Where
t1.OrderDate >= '20030101'
and t2.OrderDate > '20030101'
and t2.OrderDate <= '20031231'
and t2.customerID is null
将 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
。
我正在尝试获取上一年未下订单的所有客户 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
但它 returns 是一个空集。 我在这里错过了什么?
使用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'
)
我们没有多少信息可以解决您的查询问题。
你能给我们描述一下你的桌子吗?
where 子句中唯一可能出现的问题:
Where
t1.OrderDate >= '20040101'
and t2.OrderDate > '20030101'
and t2.OrderDate <= '20031231'
and t2.customerID is null
我想两个游标的 OrderDate 间隔应该相同,不是吗? 试试这个 where 子句:
Where
t1.OrderDate >= '20030101'
and t2.OrderDate > '20030101'
and t2.OrderDate <= '20031231'
and t2.customerID is null
将 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
。