我会尽量让我的问题听起来不那么混乱.我提前为任何措辞错误道歉,因为我试图尽我所能地说出我的问题:
使用T-SQL我需要编写一个join语句来获取表A和表B中匹配的所有结果
和(!)
另一个连接语句(或第一个连接的延续)返回表A中DID在表B中没有匹配的所有结果,但是在第二个结果集中,我需要将其中一个列设置为"N/A" "识别没有匹配的记录.
换句话说,我需要能够返回表A中所有内容的东西,但也会识别B中未匹配的行.然后在报告中使用该信息.
这是我到目前为止:
我完成了第一部分:
LEFT OUTER JOIN dbo.chart B
ON B.UserName = A.user_name
Run Code Online (Sandbox Code Playgroud)
这让我得到匹配的记录和匹配的记录
我尝试添加第二个连接:
JOIN dbo.chart
ON NOT EXISTS (select * from B.UserName = A.user_name)
Run Code Online (Sandbox Code Playgroud)
希望它能得到不匹配的记录(我计划在感兴趣的列上使用REPLACE标记该列"N/A")但是我的synthax有明显的错误,因为它会产生异常.
我的问题是我需要改变什么来获得你需要的结果.我知道我需要至少有一个连接,因为我有其他部分的查询可以使用.我只是不知道我是否需要有一个连接返回两组数据我实际上确实需要第二个只是为了不匹配的记录.
希望这不是太混乱.任何帮助将不胜感激.
谢谢!
更新:我只想强调,我考虑使用第二个连接而不是一次获得所有结果的原因是因为我需要正确识别和标记那些在我得到的所有内容中不匹配的行.
样本数据:
declare @TableA table
(
TableAID int,
TableAName varchar(10)
)
declare @TableB table
(
TableBID int,
TableBName varchar(10),
TableAID int
)
insert into @TableA values
(1, 'A 1'),
(2, 'A 2'),
(3, 'A 3')
insert into @TableB values
(1, 'B 1', 1),
(2, 'B 2', 2)
Run Code Online (Sandbox Code Playgroud)
N/A 代替 TableBName:
select A.TableAName,
coalesce(B.TableBName, 'N/A') as TableBName
from @TableA as A
left outer join @TableB as B
on A.TableAID = B.TableAID
Run Code Online (Sandbox Code Playgroud)
结果:
TableAName TableBName
---------- ----------
A 1 B 1
A 2 B 2
A 3 N/A
Run Code Online (Sandbox Code Playgroud)
不适用的额外列:
select A.TableAName,
B.TableBName,
case when B.TableBID is null
then 'N/A'
else ''
end as TableBPresent
from @TableA as A
left outer join @TableB as B
on A.TableAID = B.TableAID
Run Code Online (Sandbox Code Playgroud)
结果:
TableAName TableBName TableBPresent
---------- ---------- -------------
A 1 B 1
A 2 B 2
A 3 NULL N/A
Run Code Online (Sandbox Code Playgroud)