小编典典

LEFT OUTER JOIN(产生额外的行)问题

sql

我有两个表,我想使用左外部联接将它们联接在一起。但是,即使我的左表仅包含唯一值,右表也可以多次满足CONDITION,因此会向结果集添加额外的行。

复制问题的代码:

declare @tb1 table (c1 int)
declare @tb2 table (c2 int)

INSERT INTO @tb1 VALUES (1)
INSERT INTO @tb1 VALUES (2)
INSERT INTO @tb1 VALUES (3)
INSERT INTO @tb1 VALUES (4)

INSERT INTO @tb2 VALUES (3)
INSERT INTO @tb2 VALUES (4)
INSERT INTO @tb2 VALUES (5)
INSERT INTO @tb2 VALUES (6)

select * from @tb1 left outer join @tb2 ON c1 = c2

INSERT INTO @tb2 VALUES (3)
INSERT INTO @tb2 VALUES (4)
INSERT INTO @tb2 VALUES (5)
INSERT INTO @tb2 VALUES (6)

select * from @tb1 left outer join @tb2 ON c1 = c2

如您所见,尽管左表保持不变,但第一个SELECT返回4行,第二个SELECT 6返回。

一个人如何严格遵守左表,而仅使用右表来补全左表中的行?

帮助!

RESULTS:
c1          c2
----------- -----------
1           NULL
2           NULL
3           3
4           4

[DUPLICATE @tb2 records]

c1          c2
----------- -----------
1           NULL
2           NULL
3           3
3           3
4           4
4           4

阅读 235

收藏
2021-03-23

共1个答案

小编典典

抱歉,您的想法歪了。

这样考虑:如果您只希望tb1中的每一行都来自tb2中的一行,那么服务器应该选择哪一行?事实是,根据联接的定义,右侧表中与左侧行匹配的每一行都是匹配项,必须包含在内。

在连接之前,您必须确保tbl2对于c2具有不同的值。只要您的SQL变体支持DISTINCT [column](并非全部),Murph的建议就可以做到。

2021-03-23