Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.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
T-SQL根据位参数值查找匹配行_Sql_Sql Server_Database_Stored Procedures - Fatal编程技术网

T-SQL根据位参数值查找匹配行

T-SQL根据位参数值查找匹配行,sql,sql-server,database,stored-procedures,Sql,Sql Server,Database,Stored Procedures,我试图创建一个存储过程,该过程返回person表中的行,这些行对于特定列具有相同的值。我想让存储过程接受参数值,例如:名位上的@match_和姓位上的@match_。例如,EXEC find_matching@match_on_forenames 1,@match_on_namese 1会在表中找到forenames和namese字段匹配的行,显然不匹配自身 我有一个类似于以下内容的存储过程: ALTER PROC get_matching_records @match_on_foren

我试图创建一个存储过程,该过程返回person表中的行,这些行对于特定列具有相同的值。我想让存储过程接受参数值,例如:名位上的@match_和姓位上的@match_。例如,EXEC find_matching@match_on_forenames 1,@match_on_namese 1会在表中找到forenames和namese字段匹配的行,显然不匹配自身

我有一个类似于以下内容的存储过程:

ALTER PROC get_matching_records
    @match_on_forenames BIT,
    @match_on_surname BIT
AS
SELECT DISTINCT
    p.forenames, p.surname
FROM 
    person p
WHERE       
    EXISTS 
      (
            SELECT 
                p1.forenames, p1.surname
            FROM 
                person p1                                                                   
            WHERE                                                                                                                            
                (((@match_on_forenames = 1 AND p.forenames = p1.forenames AND p.id <> p1.id)) OR @match_on_forenames = 0)
                AND (((@match_on_surname = 1 AND p.surname = p1.surname AND p.id <> p1.id)) OR @match_on_surname = 0)
                )
一旦我在名称上引入OR@match\u,查询的性能就会变得非常差

你知道我该如何处理这个问题吗

非常感谢

这就是你的逻辑:

WHERE EXISTS (SELECT 1
              FROM person p1                                                                   
              WHERE                                                                                                                            
                (((@match_on_forenames = 1 AND p.forenames = p1.forenames AND p.id <> p1.id)) OR @match_on_forenames = 0)
                AND (((@match_on_surname = 1 AND p.surname = p1.surname AND p.id <> p1.id)) OR @match_on_surname = 0)
             )

根据您的观察,每个exists子句都应该很快,因为更简单的查询速度更快。

我通常避免在SQL语句中使用或 下面是我将要做的,在同一个表上使用联接

SELECT DISTINCT
p.forenames, p.surname
FROM 
person p
inner join person pmatch on
    pmatch.id <> p.id
    and
    case when @match_on_forenames =1 then pmatch.forenames else p.forenames end = p.forenames
    and 
    case when @match_on_surname =1 then pmatch.surname else p.surname end = p.surname

谢谢你的回答,这确实有效。但很抱歉,我在最初的帖子中根本没有说清楚。我可以添加更多的参数值来匹配。例如出生日期或电子邮件地址。一旦得到两个以上的参数,上述解决方案就很难实现。
SELECT DISTINCT
p.forenames, p.surname
FROM 
person p
inner join person pmatch on
    pmatch.id <> p.id
    and
    case when @match_on_forenames =1 then pmatch.forenames else p.forenames end = p.forenames
    and 
    case when @match_on_surname =1 then pmatch.surname else p.surname end = p.surname