2016-01-28 115 views
2

Basicly加入,我有一个优先级属性和值的表,像表优先级属性

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中做到这一点?

+1

ü可以把一个例子的结果集?现在不清楚你想达到什么结果 – Marty

回答

2

一种方法是使用outer apply

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中,这往往是最有效的方法。它将很好地利用table1(targetid, priority)上的索引。

3

这有几个选项。下面是一个使用row_number

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 
1

样本如果我理解正确的话你问什么,你可以写一个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) 

...编辑,以反映您的结果集

1
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