【问题标题】:SQL Server - How to do Inner Join when condition could be empty?SQL Server - 当条件可能为空时如何进行内部联接?
【发布时间】:2020-11-19 11:16:39
【问题描述】:

我正在尝试在一个带有内部联接的查询中直接从我的工厂地址 ID 中获取国家/地区。我的问题是 AddressID 可能是一个空字符串。

我如何检查并做某种异常或类似的事情?如果地址 ID 为空,我需要一个空字符串作为 f.Country 的结果。

这是我现在的查询,但如果 AddressID = '' 则该行不会显示在我的结果中。

SELECT o.FactoryID,o.Name,o.Rating,o.ProductCategory,o.Emissions,o.LatestChanges,o.AddressID,o.ProductTags,f.Country 
FROM FactoryHistory o
INNER JOIN AddressHistory f on f.AddressID = o.AddressID
WHERE NOT o.LatestChanges = 'Deleted' AND o.IsCurrent = 1 AND f.IsCurrent = 1

我的问题中的某些内容缺失或不清楚,请告诉我!

【问题讨论】:

    标签: sql sql-server left-join inner-join where-clause


    【解决方案1】:

    只要left join:

    SELECT o.FactoryID, o.Name, o.Rating, o.ProductCategory, o.Emissions, o.LatestChanges, o.AddressID, o.ProductTags, f.Country 
    FROM FactoryHistory o
    LEFT JOIN AddressHistory f on f.AddressID = o.AddressID AND f.IsCurrent = 1
    WHERE NOT o.LatestChanges = 'Deleted' AND o.IsCurrent = 1
    

    如果您仍想过滤掉 AddressID 不是 null 的工厂(假设 empty 您的意思是 null)并且地址表中不存在,那么您可以在WHERE子句中添加条件:

    WHERE 
        NOT o.LatestChanges = 'Deleted' 
        AND o.IsCurrent = 1 
        AND (o.AddressID IS NULL OR f.AddressID IS NOT NULL)
    

    用否定可能会更清楚:

    WHERE 
        NOT o.LatestChanges = 'Deleted' 
        AND o.IsCurrent = 1 
        AND NOT (o.AddressID IS NOT NULL AND f.AddressID IS NULL)
    

    【讨论】:

      猜你喜欢
      • 2011-08-24
      • 2014-05-31
      • 2011-11-21
      • 1970-01-01
      • 1970-01-01
      • 2019-05-31
      • 2023-03-25
      • 2012-01-28
      • 2011-08-15
      相关资源
      最近更新 更多