2016-01-28 2 views
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?

+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) 

... отредактирован, чтобы отразить ваше ResultSet

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 
Смежные вопросы