Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带“的SQL联合”;职级;_Sql_Sql Server_Tsql - Fatal编程技术网

带“的SQL联合”;职级;

带“的SQL联合”;职级;,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正在编写一个查询来搜索特定用户的表,这将提供精确匹配和潜在匹配 从本质上讲,用户的电子邮件地址是唯一的,因此我不需要返回超过这一行的内容,但是除此之外,我需要返回所有潜在用户,并对他们匹配的可能性进行“排名” 我希望查询尽可能高效,到目前为止,我已经避免使用游标,因为我觉得它不是必需的。下面是我当前查询的一个示例 SELECT tt.userId, tt.UserName, ad.*, 1

我正在编写一个查询来搜索特定用户的表,这将提供精确匹配和潜在匹配

从本质上讲,用户的电子邮件地址是唯一的,因此我不需要返回超过这一行的内容,但是除此之外,我需要返回所有潜在用户,并对他们匹配的可能性进行“排名”

我希望查询尽可能高效,到目前为止,我已经避免使用游标,因为我觉得它不是必需的。下面是我当前查询的一个示例

    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
显然,这里的主要缺陷是,如果电子邮件地址匹配,第二次查询中也会出现相同的用户,以此类推。此外,由于我需要对这些搜索进行排序,联合不会将这些行作为重复项进行匹配,因此我将多次让同一用户返回


非常感谢您的建议。

您根本不需要工会:

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);

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

这是未经测试的,因为没有样本数据,但是,我相信这会起作用。如果没有,请发布一些DDL和耗材样本数据:

WITH Results AS(
    SELECT tt.UserID,
           tt.UserName,
           ad.*,
           DENSE_RANK() OVER (ORDER BY CASE WHEN tt.EmailAddress = @EmailAddress THEN 0 ELSE 1 END) AS RN
    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))
SELECT *
FROM Results
WHERE RN = 1;

densite\u RANK()
意味着您将得到两个组,但是,如果找不到电子邮件地址,所有结果的RN值都将为1。否则,具有相同电子邮件地址的人的RN为1,而其余的人为2(这意味着这些匹配不会显示在CTE之外的
WHERE
子句中。

我是否正确理解,如果找到了电子邮件地址的用户,那么姓氏和出生日期就不应该匹配?正确。这正是我想要的。感谢这一点-周五大脑刚刚融化!再次感谢。