与 "Ranks"的 SQL 联合

标签 sql sql-server tsql

我正在编写查询来搜索特定用户的表,这将提供完全匹配和潜在匹配。

本质上,用户的电子邮件地址是唯一的,因此我不需要返回比这一行更多的信息,但除此之外,我需要返回所有潜在用户以及他们匹配可能性的“排名”。

我希望查询尽可能高效,到目前为止我已经避免使用游标,因为我觉得它没有必要。这是我当前查询的示例。

    SELECT 
            tt.userId,
            tt.UserName,
            ad.*,
            1 AS 'Rank'
        FROM
            Users.User tt
        LEFT JOIN
            General.[Address] ad ON tt.AddressId = ad.AddressId
        WHERE
            tt.EmailAddress = @EmailAddress
    UNION

        SELECT 
            tt.userId,
            tt.UserName,
            ad.*,
            2 AS 'Rank'
        FROM
            Users.User tt
        LEFT JOIN
            General.[Address] ad ON tt.AddressId = ad.AddressId
        WHERE
            tt.LastName = @LastName
            AND tt.BirthDate = @DOB

显然这里的主要缺陷是,如果电子邮件地址匹配,则同一用户也会出现在第二个查询中,依此类推。此外,由于我需要对这些搜索进行排名,联合不会将这些行匹配为重复项,因此我会多次返回同一用户。

非常感谢任何建议。

最佳答案

你根本不需要union:

SELECT tt.userId, tt.UserName, ad.*,
       (CASE WHEN tt.EmailAddress = @EmailAddress THEN 1
             WHEN tt.LastName = @LastName AND tt.BirthDate = @DOB THEN 2
        END) as [Rank]
FROM Users.User tt LEFT JOIN
     General.[Address] ad
     ON tt.AddressId = ad.AddressId
WHERE (tt.EmailAddress = @EmailAddress) OR
      (tt.LastName = @LastName AND tt.BirthDate = @DOB);

显然,添加额外的条件很容易,例如当所有三列都匹配时的新排名。

关于与 "Ranks"的 SQL 联合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47831500/

相关文章:

MySQL - 如何优化大量条件

带组的 SQL 随机样本

sql-server - 添加具有生成名称的 DEFAULT 约束

sql - sql检查某列是否为空值

sql-server - SQL Server STUFF-应该与位置> 8000一起使用吗?

mysql - 查询列中的循环值

MYSQL - 分组依据和排序依据

sql - 创建计算列并舍入

java.sql.SQLException : No value specified for parameter 2 异常

sql - 哪一行的值最高?