I am trying to do a LEFT JOIN to merge a table and view and the right table has duplicate items(usernames). I want to keep them but add another column to mark them as isDuplicate='TRUE'.
I wanted to use CASE WHEN EXISTS but can’t get it to work correctly, it produces wrong results:
SELECT vc.id AS [id]
,vc.server AS [server]
,vc.username AS [vc_username]
,s.username AS [s_username]
,s.name AS [name]
,s.email AS [email]
,CASE WHEN EXISTS (SELECT s.username WHERE vc.username = s.username)
THEN 'TRUE'
ELSE 'FALSE'
END AS [isDuplicate]
FROM v_view vc
LEFT JOIN s_table s ON vc.username = s.username
Ideally I would like to not mark the first occurence of a row as duplicate. E.g. first time username appears it is not marked as duplicate, second time it is a duplicate. If not possible then just mark all rows that don’t have unique usernames as isDuplicate='TRUE'.
Example data:
View:
id server username 1 server1 user1 2 server2 user2 3 server3 user3
Table:
username name email user1 Bob bob@example.com user1 BobAdmin bobadm@example.com user2 John john@example.com user3 Daniel daniel@example.com user4 Adam adam@example.com
Expected result:
id server vc_username s_username name email isDuplicate 1 server1 user1 user1 Bob bob@example.com FALSE 1 server1 user1 user1 BobAdmin bobadm@example.com TRUE 2 server2 user2 user2 John john@example.com FALSE 3 server3 user3 user3 Daniel daniel@example.com FALSE
Alternative option if first is not possible:
id server vc_username s_username name email isDuplicate 1 server1 user1 user1 Bob bob@example.com TRUE 1 server1 user1 user1 BobAdmin bobadm@example.com TRUE 2 server2 user2 user2 John john@example.com FALSE 3 server3 user3 user3 Daniel daniel@example.com FALSE
Advertisement
Answer
I think you want row_number() or count(*). To tag all duplicate user names:
SELECT . . .,
(CASE WHEN COUNT(*) OVER (PARTITION BY username) > 1
THEN 'TRUE'
ELSE 'FALSE'
END) AS [isDuplicate]
FROM v_view vc LEFT JOIN
s_table s
ON vc.username = s.username;
You would use row_number() . . . = 1 if you wanted to identify as duplicates all but one of the duplicates.