左连接带来表B中的每一行

时间:2015-08-26 16:57:52

标签: sql

我用2个表做了一个非常简单的例子:

表A:user_client

id   | username
---------------
2222 | test

表B:user_client_contact

client_id | country
--------------------
2222      | latvia
2222      | estonia

我得到了结果:

id
-----
2222
2222

但我期望的结果是:

id
-----
2222

SQL:

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

请在此处查看sqlfiflle:http://sqlfiddle.com/#!9/270cc/7

2 个答案:

答案 0 :(得分:3)

根据您的查询:

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

您正在加入id和client_id。 user_client_contact中有两个条目,值为2222,这意味着user_client.id将出现两次,一个位于user_client_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)

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

答案 1 :(得分:2)

您可以在select语句中添加distinct:

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

DISTINCT关键字可用于仅返回不同的(不同的)值。

8关于不同。