Sql 左联接带来表B中的每一行

Sql 左联接带来表B中的每一行,sql,Sql,我用两个表做了一个非常简单的示例: 表A:用户/客户端 表B:用户\客户\联系人 我得到的结果是: id ----- 2222 2222 但我所期望的结果是: id ----- 2222 SQL: 请参见此处的SQLFILLE:您可以将distinct添加到select语句中: select distinct user_client.id from user_client left join user_client_contact on user_client_contact.clie

我用两个表做了一个非常简单的示例:

表A:用户/客户端

表B:用户\客户\联系人

我得到的结果是:

id
-----
2222
2222
但我所期望的结果是:

id
-----
2222
SQL:


请参见此处的SQLFILLE:

您可以将distinct添加到select语句中:

select distinct user_client.id
from user_client
left join user_client_contact 
  on user_client_contact.client_id = user_client.id
DISTINCT关键字只能用于返回不同的值


关于distinct。

您可以将distinct添加到select语句中:

select distinct user_client.id
from user_client
left join user_client_contact 
  on user_client_contact.client_id = user_client.id
DISTINCT关键字只能用于返回不同的值

关于distinct.

只需使用关键字即可消除重复项:

select distinct
    user_client.id
from user_client
left join user_client_contact on user_client_contact.client_id = user_client.id
如果您只希望user_client.id在user_client_contact表中具有条目,则应使用内部联接,而不是左联接:

您获得两行的原因是,用户\客户端中的1行可以连接到用户\客户端\联系人中的两行。如果从查询中选择所有内容,如:

select *
from user_client
left join user_client_contact on user_client_contact.client_id = user_client.id
你会看到,你得到了两个不同的行,一个是22222,拉脱维亚,一个是22222,爱沙尼亚。由于您只从两个表之间的列中选择了一列(共3列),因此它们看起来是重复的。正如我在开始时所说,使用distinct只会给出唯一的值。

只需使用关键字来消除重复:

select distinct
    user_client.id
from user_client
left join user_client_contact on user_client_contact.client_id = user_client.id
如果您只希望user_client.id在user_client_contact表中具有条目,则应使用内部联接,而不是左联接:

您获得两行的原因是,用户\客户端中的1行可以连接到用户\客户端\联系人中的两行。如果从查询中选择所有内容,如:

select *
from user_client
left join user_client_contact on user_client_contact.client_id = user_client.id

你会看到,你得到了两个不同的行,一个是22222,拉脱维亚,一个是22222,爱沙尼亚。由于您只从两个表之间的列中选择了一列(共3列),因此它们看起来是重复的。正如我在开始时所说,使用distinct只会得到唯一的值。

这就是左连接的作用。如果您不需要表B中的信息,听起来可能需要半联接。像这样:

select 
    user_client.id
from user_client
where exists ( SELECT 'contact' FROM user_client_contact WHERE user_client_contact.client_id = user_client.id )

或者,如果只需要表B中的一行,只需在WHERE子句中指定更多条件。

这就是左连接的作用。如果您不需要表B中的信息,听起来可能需要半联接。像这样:

select 
    user_client.id
from user_client
where exists ( SELECT 'contact' FROM user_client_contact WHERE user_client_contact.client_id = user_client.id )
或者,如果只需要表B中的一行,则只需在WHERE子句中指定更多条件。

根据查询:

select 
    user_client.id
from user_client
left join user_client_contact on 
user_client_contact.client_id = user_client.id
您正在加入id和client\u id。user\u client\u contact中有两个值为2222的条目,这意味着user\u client.id将出现两次,在user\u client\u contact中的每个匹配行前面各出现一次

您可以通过两种不同的方法解决此问题,最简单的方法是:

select 
    distinct user_client.id
from user_client
left join user_client_contact on 
user_client_contact.client_id = user_client.id
你也可以这样做:

   SELECT user_client.id FROM user_client 
     WHERE User_client.id IN (select client_id FROM user_client_contact)
注意:有一种误解认为子查询会自动变慢,但这不一定是事实。它会根据具体情况而有所不同,但通常优化器会考虑子查询并加快它们的速度,尤其是与distinct相比。根据您的查询,这里有一个比较这两者的例子。

select 
    user_client.id
from user_client
left join user_client_contact on 
user_client_contact.client_id = user_client.id
您正在加入id和client\u id。user\u client\u contact中有两个值为2222的条目,这意味着user\u client.id将出现两次,在user\u client\u contact中的每个匹配行前面各出现一次

您可以通过两种不同的方法解决此问题,最简单的方法是:

select 
    distinct user_client.id
from user_client
left join user_client_contact on 
user_client_contact.client_id = user_client.id
你也可以这样做:

   SELECT user_client.id FROM user_client 
     WHERE User_client.id IN (select client_id FROM user_client_contact)

注意:有一种误解认为子查询会自动变慢,但这不一定是事实。它会根据具体情况而有所不同,但通常优化器会考虑子查询并加快它们的速度,尤其是与distinct相比。这是对两者的比较。

返回2行的原因是,用户\u客户端\u联系人表中的所有行都与用户\u客户端\u表中的用户\u客户端id具有相同的值;因此,结果有两行。 如果希望在user_client表中的每一行只看到一行,则需要在查询中添加一个distinct子句。请参见以下查询:

select DISTINCT
    user_client.id
from user_client left join user_client_contact
    on user_client_contact.client_id = user_client.id

返回2行的原因是,user\u client\u contact表中的所有行都具有与user\u client表中的user\u client\u id相同的值;因此,结果有两行。 如果希望在user_client表中的每一行只看到一行,则需要在查询中添加一个distinct子句。请参见以下查询:

select DISTINCT
    user_client.id
from user_client left join user_client_contact
    on user_client_contact.client_id = user_client.id

左联接至少会将左表中的每一行引入一次,并对右表中的每一个匹配行进行重复……这就是为什么会得到重复项

您可能想做的是将相关子查询与exists结合使用:


左连接至少会将左表中的每一行引入一次,并对右表中的每一个匹配行进行重复……这就是为什么您会得到 复制品

您可能想做的是将相关子查询与exists结合使用:


你得到的结果是正确的。你的期望是错误的。如果你只是想要用户\客户端id信息,为什么还要加入呢?正如我所说,我只是做了一个简单的例子。真正的查询要大得多,表也更多。如果您只想看到这些,请在查询结束时尝试按用户分组\u client.id。您为什么期望得到这样的结果?您是否阅读了联接的工作原理?您得到的结果是正确的。你的期望是错误的。如果你只是想要用户\客户端id信息,为什么还要加入呢?正如我所说,我只是做了一个简单的例子。真正的查询要大得多,并且包含更多的表。如果您只想看到这些,请在查询结束时尝试按用户\u client.id分组。您为什么期望得到这样的结果?您是否阅读了联接的工作原理?me 2;-但我没有投你反对票;你有一个我2;-但我没有投你反对票;你拿了一个