我有两个表,我想使用左外部联接将它们联接在一起。但是,即使我的左表仅包含唯一值,右表也可以多次满足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
抱歉,您的想法歪了。
这样考虑:如果您只希望tb1中的每一行都来自tb2中的一行,那么服务器应该选择哪一行?事实是,根据联接的定义,右侧表中与左侧行匹配的每一行都是匹配项,必须包含在内。
在连接之前,您必须确保tbl2对于c2具有不同的值。只要您的SQL变体支持DISTINCT [column](并非全部),Murph的建议就可以做到。