SQL(PostgreSQL):如何编写查询以获取同一个表中具有相同姓氏的名称列表

时间:2018-02-19 09:06:11

标签: sql postgresql

我有一张演员名单表。现在我想拥有的是具有相同姓氏的演员名单。如果演员具有唯一的姓氏,他将不会出现在结果集中。

为此,我试过了:

SELECT a1.first_name, a1.last_name 
FROM actor a1, actor a2 
WHERE a1.last_name = a2.last_name AND a1.actor_id !=  a2.actor_id
ORDER BY a1.last_name; 

现在它工作正常,除了我得到多个重复的条目。就像在这里附上的图片一样。

重复条目的结果。

Result with duplicate entries.

当然,很明显每次条目与另一个条目的last_name匹配时,都会在列表中打印一个actor的名字。如果它与其他两个人匹配,则会将其打印两次。但是,即使在有许多其他比赛中,也希望打印一次,如图所示。

期望的结果:

Desired result.

3 个答案:

答案 0 :(得分:1)

请勿使用联接,而是使用与EXISTS相关的联合子查询:

select a1.*
from actor a1
where exists (select *
              from actor a2
              where a2.last_name = a1.last_name
                and a2.actor_id <> a1.actor_id);

答案 1 :(得分:0)

要删除重复项,只需添加GROUP BY子句:

SELECT a1.first_name, a1.last_name 
FROM actor a1, actor a2 
WHERE a1.last_name = a2.last_name AND a1.actor_id !=  a2.actor_id
GROUP BY a1.first_name, a1.last_name
ORDER BY a1.last_name; 

答案 2 :(得分:0)

我认为您可以使用SELECT语句中使用的DISTINCT子句从结果集中删除重复的行。

请参阅此文章:http://www.postgresqltutorial.com/postgresql-select-distinct/

所以你的查询看起来像这样:

SELECT DISTINCT a1.first_name, a1.last_name FROM actor a1, actor a2 WHERE a1.last_name = a2.last_name AND a1.actor_id != a2.actor_id ORDER BY a1.last_name;