2017-01-19 83 views
0

我有2個表:PostgreSQL - 如何使用WHERE子句執行LEFT OUTER JOIN時刪除重複項?

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

statuses table 
+---------+---------+ 
| id  | integer | 
+---------+---------+ 
| user_id | integer | 
+---------+---------+ 
| step_1 | boolean | 
+---------+---------+ 
| step_2 | boolean | 
+---------+---------+ 

我做LEFT OUTER JOINstatuses表上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 

我的問題

也有一些網友認爲users表中有相同的電話號碼,我想根據手機刪除重複的用戶數。

我不想從數據庫中刪除它們。但只想排除它們僅適用於此查詢。例如,約翰(身份證號碼:1)和薩拉(身份證號碼:2)共用同一個電話號碼(+ 6012-3456789),刪除其中的一個,約翰或薩拉對我來說都很不錯。

我試過但沒有工作?

第一:

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 

二:

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 
+0

你是什麼意思爲「我想刪除其中之一」?你想刪除相關的行表格表? – scaisEdge

+0

@scaisEdge不要刪除,但只是想排除它們。 –

+0

添加一些示例表數據和預期結果。請記住,SELECT DISTINCT適用於整個選定的行。 – jarlh

回答

0

下面是

自加入用戶表,並使用電話號碼加入和過濾重複名稱的任何一個的一種方式比較運算符。

SELECT * 
FROM (SELECT u.* 
     FROM users u 
       JOIN users u1 
       ON u. u.phone = u1.phone -- to 
        AND u.name >= u1.name) u 
     LEFT OUTER JOIN statuses 
        ON users.id = statuses.user_id 
WHERE (users.active = 'f') 

或使用ROW_NUMBER

生成每個電話號碼的行數和行號爲篩選的第一個號碼爲1

SELECT * 
FROM (SELECT u.*, 
       Row_number()OVER(partition BY phone ORDER BY name) rn 
     FROM users u) u 
     LEFT OUTER JOIN statuses 
        ON users.id = statuses.user_id 
WHERE (users.active = 'f') 
     AND rn = 1 
+0

你能解釋一下你在做什麼嗎? –

+0

@ZulhilmiZainudin - 在這裏沒有太多解釋它是一個簡單的加入。 –

1

之前我會做的做加盟。在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; 

distinct on回報一行無論是在括號中。在這種情況下,這將是phone(基於「我想根據電話號碼刪除重複的用戶」)。然後,join不應該顯示這些重複項。

+0

你能解釋一下你在做什麼嗎? –