2016-01-28 152 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