我会尽量让我的问题听起来不那么混乱。我提前为任何措辞错误道歉,因为我试图尽我所能地说出我的问题:
使用T-SQL我需要编写一个连接语句,它可以获得表A和表B中匹配的所有结果
AND(!)
另一个连接语句(或第一个连接的延续),它返回表A中DID在表B中没有匹配的所有结果,但在第二个结果集中,我需要将其中一个列设置为“ N / A“用于识别没有匹配的记录。
换句话说,我需要能够返回表A中所有内容的东西,但也会识别B中未匹配的行。然后在报告中使用该信息。
这是我到目前为止所做的:
我完成了第一部分:
LEFT OUTER JOIN dbo.chart B
ON B.UserName = A.user_name
这会得到匹配的记录和匹配的记录
我尝试添加第二次加入:
JOIN dbo.chart
ON NOT EXISTS (select * from B.UserName = A.user_name)
希望它能得到不匹配的记录(我计划在感兴趣的列上使用REPLACE来标记该列“N / A”)但是我的synthax有明显的错误,因为它会产生异常。
我的问题是我需要改变什么才能获得您需要的结果。我知道我需要至少有一个连接,因为我有其他部分的查询可以使用。我只是不知道是否需要有一个连接返回两组数据我实际上确实需要第二个仅用于非匹配记录。
希望这不是太混乱。任何帮助将不胜感激。
谢谢!
更新:我想强调的是,我考虑使用第二个连接而不是一次获得所有结果的原因是因为我需要正确识别并标记那些在所有内容中不匹配的行我回来了。
答案 0 :(得分:3)
我不确定第二次加入你的目的地。 LEFT JOIN似乎可以做你想做的一切......
DECLARE @tableA TABLE (a_id INT) INSERT INTO @tableA VALUES (1), (2), (3), (4)
DECLARE @tableB TABLE (b_id INT) INSERT INTO @tableB VALUES (2), (3)
SELECT * FROM @tableA AS A LEFT JOIN @tableB AS B on A.a_id = b.b_id
a_id | b_id
------+------
1 | NULL
2 | 2
3 | 3
4 | NULL
除非你的意思是你实际上在一起加入3张桌子?
DECLARE @org TABLE (o_io INT) INSERT INTO @org VALUE (2), (3), (4)
DECLARE @tableA TABLE (a_id INT) INSERT INTO @tableA VALUES (1), (2), (3), (4)
DECLARE @tableB TABLE (b_id INT) INSERT INTO @tableB VALUES (2), (3)
SELECT
*
FROM
@org AS O
INNER JOIN
@tableA AS A
ON O.o_id = A.a_id
LEFT JOIN
@tableB AS B
ON A.a_id = b.b_id
o_id | a_id | b_id
------+------+------
2 | 2 | 2
3 | 3 | 3
4 | 4 | NULL
答案 1 :(得分:1)
示例数据:
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)
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
结果:
TableAName TableBName
---------- ----------
A 1 B 1
A 2 B 2
A 3 N/A
N / A的额外栏目:
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
结果:
TableAName TableBName TableBPresent
---------- ---------- -------------
A 1 B 1
A 2 B 2
A 3 NULL N/A
答案 2 :(得分:0)
尝试使用union:
select A.id, b.id, b.desc from tablea A LEFT OUTER JOIN dbo.chart B
ON B.UserName = A.user_name
UNION
select a.id, 0, 'N/A' from tablea where NOT EXISTS (select * from B.UserName = A.user_name)