在T-SQL中使用左联接进行选择时,将现有行标记为重复行
我正在尝试进行左连接以合并表和视图,而右表具有重复的ItemsUserName。我想保留它们,但添加另一列以将它们标记为isDuplicate='TRUE' 我想在用例存在但无法正常工作时使用它,它会产生错误的结果:在T-SQL中使用左联接进行选择时,将现有行标记为重复行,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正在尝试进行左连接以合并表和视图,而右表具有重复的ItemsUserName。我想保留它们,但添加另一列以将它们标记为isDuplicate='TRUE' 我想在用例存在但无法正常工作时使用它,它会产生错误的结果: 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] ,
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
理想情况下,我不希望将第一次出现的行标记为重复。例如,用户名第一次出现时未标记为重复,第二次出现时为重复。如果不可能,那么只需将所有没有唯一用户名的行标记为isDuplicate='TRUE'
示例数据:
视图:
表:
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
预期结果:
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
如果第一种方法不可行,可选择:
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
我想你想要排号还是计数*。要标记所有重复的用户名,请执行以下操作:
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;
您将使用行号…=1如果要将除一个副本以外的所有副本标识为重复项。您不需要再次使用EXISTS子句。你可以选择CASE逻辑或IIF逻辑 选择vc.id作为[id] ,vc.server作为[服务器] ,vc.username为[vc_username] ,s.username作为[s_username] ,s.姓名为[姓名] ,s.email AS[电子邮件] ,IIFs.username不为NULL,'TRUE','FALSE'为IsDuplicate 从v_视图vc 在vc.username=s.username上左连接s_表s 或 选择vc.id作为[id] ,vc.server作为[服务器] ,vc.username为[vc_username] ,s.username作为[s_username] ,s.姓名为[姓名] ,s.email AS[电子邮件] ,如果s.username不为NULL,则“TRUE”或“FALSE”以IsDuplicate结尾 从v_视图vc 在vc.username=s.username上左连接s_表s
请提供样本数据和期望的结果。@GordonLinoff很抱歉,我刚刚添加了样本数据和期望的结果,谢谢!再试一次-这一次在预期输出中包括IsDuplicate列。既然你离开了join,也请提供一个例子。@SMor谢谢你指出这一点!旁白:您如何期望返回“TRUE”或“FALSE”的case表达式在预期结果中产生“yes”或“no”?有人不喝咖啡或茶吗?
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;