PostgreSQL - 使用 WHERE 子句执行 LEFT OUTER JOIN 时如何删除重复项?

Zul*_*din 0 sql postgresql join left-join

我有 2 张桌子:

users table
+--------+---------+
| id     | integer |
+--------+---------+
| phone  | string  |
+--------+---------+
| active | boolean |
+--------+---------+

statuses table
+---------+---------+
| id      | integer |
+---------+---------+
| user_id | integer |
+---------+---------+
| step_1  | boolean |
+---------+---------+
| step_2  | boolean |
+---------+---------+
Run Code Online (Sandbox Code Playgroud)

我正在使用这样的子句对表进行LEFT OUTER JOIN statuses表操作:usersWHERE

SELECT users.id, statuses.step_1, statuses.step_2
FROM users 
LEFT OUTER JOIN statuses ON users.id = statuses.user_id
WHERE (users.active='f')
ORDER BY users.id DESC
Run Code Online (Sandbox Code Playgroud)

我的问题

表中有些用户具有相同的电话号码users,我想根据电话号码删除重复的用户。

我不想从数据库中删除它们。但只想将此查询排除在外。

例如,假设John(ID:1)和Sara(ID:2)共享同一个电话号码(+6012-3456789),删除其中一个,John或Sara对我来说都可以。

我已经尝试过但没有成功?

第一的:

SELECT DISTINCT users.phone
FROM users 
LEFT OUTER JOIN statuses ON users.id = statuses.user_id
WHERE (users.active='f')
ORDER BY users.id DESC
Run Code Online (Sandbox Code Playgroud)

第二:

SELECT users.phone, COUNT(*)
FROM users
LEFT OUTER JOIN statuses ON users.id = statuses.user_id    
WHERE (users.active='f')
GROUP BY phone
HAVING COUNT(users.phone) > 1
Run Code Online (Sandbox Code Playgroud)

Gor*_*off 5

我会在加入之前这样做。在 Postgres 中,select distinct on是一个非常有用的结构:

SELECT u.id, s.step_1, s.step_2
FROM (SELECT distinct on (phone) u.*
      FROM users u
      WHERE u.active = 'f'
      ORDER BY phone
     ) u LEFT OUTER JOIN
     statuses s
     ON u.id = s.user_id
WHERE u.active = 'f'
ORDER BY u.id DESC;
Run Code Online (Sandbox Code Playgroud)

distinct on对于括号中的内容返回一行。在这种情况下,那就是phone(基于“我想根据电话号码删除重复的用户”)。然后,join不应将这些显示为重复项。