【问题标题】:SQL Left Join with where clause returning null valuesSQL Left Join with where 子句返回空值
【发布时间】:2018-07-30 10:36:06
【问题描述】:

我的连接有问题,我似乎无法修复,这是代码的精简版

SELECT top 5
a.Name00,
b.MIDNumber

FROM
[CM_UOC].[dbo].[Computer_System_DATA] AS a

LEFT OUTER JOIN
[UoC_Inventory].[dbo].[Inv_DATA] AS b on b.MIDNumber like '%'+a.Name00+'%'

基本上 ID 是相同的,但 a.Name00 中的某些 ID 有前导或尾随字符,例如“AVMID..”基于这些条目的任何匹配项都会找到并连接,但会返回从表“b”中选择的任何列作为NULL。如果没有前导或尾随字符,则连接很好。

我得到的是

Name00      MIDNumber
AVMID014253 NULL
AVMID10059  NULL
AVMID10061  NULL
AVMID10063  NULL
AVMID10064  NULL

我需要的是

Name00      MIDNumber
AVMID014253 MID14253
AVMID10059  MID10059
AVMID10061  MID10061
AVMID10063  MID10063
AVMID10064  MID10064

我知道如果没有匹配项,LEFT JOIN 将返回空值,但我如何才能加入并获得我正在寻找的输出?

编辑

用这个修复了前导字符

WITH A AS
(
SELECT 'M'+right(Name00, len(Name00) - charindex('M', Name00)) as 'A_MID'
FROM [CM_UOC].[dbo].[Computer_System_DATA]
),
B AS
(
SELECT MIDNumber AS 'B_MID'
FROM [UoC_Inventory].[dbo].[Inv_DATA]
)
SELECT * FROM A LEFT JOIN B ON (B.B_MID = A.A_MID)

WHERE B.B_MID IS NOT NULL
ORDER BY A_MID DESC

仍然无法修剪任何前导字符

【问题讨论】:

  • 你是left joining 一张桌子。 where 子句没有提到那个表,所以where 子句对left join 没有影响。
  • WHERE 子句提到了 a.Name00,所以这不会导致它恢复为 INNER JOIN,这可以解释为什么我从表 h 中获取空值?
  • 不,它不会做任何这样的事情。 WHERE 对 FROM 的结果进行操作(从概念上讲),并且不会以任何方式“影响”或“改变”它。如果您的 FROM 说 LEFT JOIN,那么将会发生 LEFT JOIN,句号。
  • 问题是,它把它当作一个左连接。如果连接不匹配,则按原样运行查询会将表 h 中的任何列保留为 NULL。如果我在没有 final 和语句的情况下运行查询,一切都会返回正常。

标签: sql sql-server join null where


【解决方案1】:

在这种情况下,您可以使用 CHARINDEX 函数:

SELECT top 5 a.Name00,
             b.MIDNumber
FROM [CM_UOC].[dbo].[Computer_System_DATA] AS a
   LEFT OUTER JOIN [UoC_Inventory].[dbo].[Inv_DATA] AS b 
                on CHARINDEX(b.MIDNumber,a.Name00) > 0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-15
    • 2017-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-20
    相关资源
    最近更新 更多