Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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 server SQL Server最佳X匹配_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql server SQL Server最佳X匹配

Sql server SQL Server最佳X匹配,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我正在尝试执行一个查询,该查询可以返回5个条件中大部分匹配的结果。但如果有一个5对5的匹配,则优先 为了说明我的问题,准备了下面的SQL declare @tmp table ( id int identity ,field1 nvarchar(60) ,field2 nvarchar(60) ,field3 nvarchar(60) ,field4 nvarchar(60) ,field5 nvarchar(60) ) insert into @tmp values ('Bob','

我正在尝试执行一个查询,该查询可以返回5个条件中大部分匹配的结果。但如果有一个5对5的匹配,则优先

为了说明我的问题,准备了下面的SQL

declare @tmp table (
id int identity
,field1 nvarchar(60)
,field2 nvarchar(60)
,field3 nvarchar(60)
,field4 nvarchar(60)
,field5 nvarchar(60)
)

insert into @tmp values
    ('Bob','Jones','Mr','000001','bob@example.com')
insert into @tmp values
    ('Bill','Jones','','000002','bill@example.com')
insert into @tmp values
    ('Sue','Jones','Mrs','000003','jones@example.com')
insert into @tmp values
    ('Adrian','Jones','','000001','jones@example.com')
insert into @tmp values
    ('Bertha','Jones','Mrs','000001','jones@example.com')

select *
from @tmp

declare @key1 nvarchar(60), @key2 nvarchar(60), @key3 nvarchar(60), @key4 nvarchar(60), @key5 nvarchar(60)

select
    @key1 = 'Bertha'
    ,@key2 = 'Jones'
    ,@key3 = 'Mrs'
    ,@key4 = '000001'
    ,@key5 = 'jones@example.com'

select
    *
    ,case when field1 = @key1 then 1 else 0 end as X1
    ,case when field2 = @key2 then 1 else 0 end as X2
    ,case when field3 = @key3 then 1 else 0 end as X3
    ,case when field4 = @key4 then 1 else 0 end as X4
    ,case when field5 = @key5 then 1 else 0 end as X5
from @tmp
如果查看结果,可以在3个字段中看到多个第3行和第4行匹配,但第5行在5个字段中匹配。因此,这是一个相同的匹配,这是我想要返回的匹配

但是,如果没有插入第5行,那么第3行和第4行是最好的匹配,在这种情况下,我希望返回它们

我一直在思考如何最好地做到这一点,如果这能起到任何作用,我将使用SQLServer2008

在实际场景中,它们并非像本例中那样都是简单的case语句,而是将select分到其他表中

我已经查看了group by,并且已经,但是我不知道如何在这个场景中使用它们

如何在SQL Server中跨多个条件进行“最佳”类型匹配


如果这看起来像页面告诉我的那样“主观”,那么说出来,我会删除它。但我不认为这是主观的,因为我认为这是一种常见的SQL重复数据消除方案。

考虑将
x
列滚动到一个总和中以获得分数。这里有一个CTE(公共表表达式),您可以从中进行查询

;with mysum AS (
select    *
    ,case when field1 = @key1 then 1 else 0 end as X1
    ,case when field2 = @key2 then 1 else 0 end as X2
    ,case when field3 = @key3 then 1 else 0 end as X3
    ,case when field4 = @key4 then 1 else 0 end as X4
    ,case when field5 = @key5 then 1 else 0 end as X5
from @tmp)

SELECT id, field1, field2, field3, field4, field5, 
       SUM(x5+x4+x3+x2+x1) AS MatchScore 
FROM MySum
GROUP BY id, field1, field2, field3, field4, field5
ORDER BY MatchScore DESC

我明白了,使用
;使用
模拟表格上方的视图。出于好奇,这样一个查询的效率将超过750000条记录。(实际上会少很多。我可以使用很多“或”语句来减少初始数据集)