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