Sql 具有优先级属性的表联接

Sql 具有优先级属性的表联接,sql,sql-server,Sql,Sql Server,基本上,我有一个带有优先级属性和值的表,如 TargetID Priority_Column (int) Value_column 1 1 "value 1" 1 2 "value 2" 1 5 "value 5 2 1 "value 1" 2

基本上,我有一个带有优先级属性和值的表,如

TargetID Priority_Column (int)   Value_column
1                  1             "value 1"
1                  2             "value 2"
1                  5             "value 5
2                  1             "value 1"
2                  2             "value 2"
我想把另一张桌子和这张桌子连接起来

 ID  Name
 1   "name 1"
 2   "name 2"
但仅使用具有最高优先级的行

结果是

TargetID Priority_Column (int)  Name        Value_column
1                  5            "name 1"    "value 5"
2                  2            "name 2"    "value 2"
当然,我可以使用像python这样的高级语言来计算每个ID的最高优先级行


但这看起来效率很低,有没有一种方法可以直接在sql中执行此操作?

有几种方法可供选择。这里有一个使用了
行号

select *
from anothertable a join (
    select *, row_number() over (partition by targetid order by priority desc) rn
    from yourtable) t on a.id = t.targetid and t.rn = 1

一种方法是使用
外部应用

select t2.*, t1.*
from table2 t2 outer apply
     (select top 1 t1.*
      from table1 t1
      where t2.id = t1.targetid
      order by priority desc
     ) t1;

我应该注意到,在SQL Server中,这通常是最有效的方法。如果我正确理解您的问题,它将充分利用
表1(targetid,priority)

上的索引-您想要第二个表中的“Max By”

这是一个例子

如果我正确理解了您的要求,您可以编写一个sql查询,在那里您将获得相应的max()优先级或min()优先级

在您的情况下,如果所需结果为“最大优先级”,则查询应为:

select a.TargetID, a.[Value_column], b.ID, b.Name
from TableA a
     join TableB b
        on a.TargetID = b.ID
where a.Priority_Column = (select max(z.Priority_Column) from TableA z 
                          and z.ID = a.TargetID)

。。。编辑以反映您的结果集

您能举例说明结果集吗?现在还不清楚你想要达到什么样的结果
SELECT  TargetID,
        Priority_Column,
        Name,
        Value_Column
FROM    (SELECT t1.TargetID,
                t1.Priority_Column,
                t2.Name,
                t1.Value_column,
                ROW_NUMBER() OVER (PARTITION BY TargetID ORDER BY Priority_Column DESC) Rn
         FROM   Table1 t1
                JOIN Table2 t2 ON t1.TargetId = t2.ID
        ) t
WHERE   Rn = 1