在 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