【发布时间】: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