Sql 左外部联接(提供额外的行)问题

Sql 左外部联接(提供额外的行)问题,sql,join,Sql,Join,我有两个表,我想使用左外连接将它们连接在一起。但是,即使我的左表只包含唯一的值,右表也多次满足该条件,因此会向结果集添加额外的行 复制问题的代码: 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

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

复制问题的代码:

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行,尽管左表保持不变

如何严格遵守左表,只使用右表来补充左表中的行

救命啊


在c1=c2上的@tb1左外连接@tb2上选择distinct*尝试使用

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

如果只想在左侧保留一行,则需要为左侧的每个唯一值决定要在右侧显示的内容。例如,如果要显示计数,可以执行以下操作:

select b1.c1, x.c from @tb1 b1 
left outer join 
(
  select c2, count(*) as c 
  from @tb2
  group by c2
) as x 
ON b1.c1 = x.c2
或者,如果您只希望c2中出现一个值:

select b1.c1, x.c2 from @tb1 b1 
left outer join 
(
  select c2
  from @tb2
  group by c2
) as x 
ON b1.c1 = x.c2

嗯,查询正在做它应该做的事情,因为右边的表中有重复的记录或至少有重复的标识符

要获得效果,您需要以下内容:

SELECT * FROM @tb1 LEFT OUTER JOIN (SELECT DISTINCT c2 FROM @tb2) t2 ON @tb1.c1 = t2.c2

如果这还不够,你需要更详细地解释一下这个要求。

对不起,你的想法有偏差

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


在连接之前,您必须确保tbl2对c2具有不同的值。Murph的建议可以做到这一点,前提是您的SQL变体支持DISTINCT[column],但并非所有SQL变体都支持DISTINCT[column]。

上面的示例只是一个示例,因此每个表只有一列。谢谢您的回答。我正在加入5个超过25000条记录的表格,这个答案正是我所需要的。谢谢。这为我节省了一些时间。在这种简化的情况下,这会起作用,但我很确定,实际上他的rhs表有更多的列-然后distinct将不会有帮助。我聚集,在这种情况下,他需要决定是什么使行不同,或者必须显示多个id为表1的行,在col上选择distinct如何,从100毫秒的执行时间开始,这将它提高到83秒。您需要向我们提供更多关于您试图实现的目标的详细信息83秒的表有多大?您在实际查询中是否使用LIKE运算符?13166165行,200000+/天我有一个表,其中有多个非不同的行登录日志我的左表是按用户ID分组的表,因此它是不同的。右边的表是原始表,其中包含我需要的数据。因此,我使用USERid将右表链接到左表,这样我就可以返回有用的数据。这是完全正确的,因此我改变了我的想法,因此我的ON语句是唯一的,从而缓解了这个问题。对于同一个示例,左外连接似乎在sqlite上返回不同的行!不知道为什么。正在做一个选择不同的。。。根据@astander建议,修复了该问题。
SELECT * FROM @tb1 LEFT OUTER JOIN (SELECT DISTINCT c2 FROM @tb2) t2 ON @tb1.c1 = t2.c2