Sql 左联接带来表B中的每一行
我用两个表做了一个非常简单的示例: 表A:用户/客户端 表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
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;-但我没有投你反对票;你拿了一个