在T-SQL中使用左联接进行选择时,将现有行标记为重复行

在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] ,

我正在尝试进行左连接以合并表和视图,而右表具有重复的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]
,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;