SQL: агрегировать после объединения с проверкой нуля - PullRequest
1 голос
/ 24 марта 2011

У меня есть эти таблицы (в SQL-Server 2008 R2):

Table1:

Id   Guid
1    {530D8FE1-7541-43CC-9F92-1AA776490155}
2    {CAC5B001-C8DE-46AA-A848-5D831633D0DF}
3    NULL

Table2:

Id    Column1    Table2FK
1     1          1
2     1          2
3     1          3

Я хочу выполнить запрос, который агрегирует по Table2.Column1 и присоединяет его к строке Table1 с максимальным идентификатором, но содержит ненулевое значение для Table1.Guid. В этом случае он должен присоединиться к строке 2 таблицы 1. Написано как запрос, я хочу что-то вроде этого (хотя это не является правильным sql):

select t2.Id, t2.Column1, t2.Table2FK, max(t1.Id), t1.Guid 
    from Table2 t2
    join Table1 t1 on t2.Table2FK = t1.Id 
    where t1.Guid is not null
    group by t2.Column1

Мне удалось выполнить нулевую проверку и агрегирование по Table2.Id2 по отдельности, но не в обоих запросах. В первом случае объединение возвращает 2 строки, во втором - объединение в строке 3 из Table1.

1 Ответ

2 голосов
/ 24 марта 2011

Вы можете использовать внешнее объединение для сопоставления строк с ненулевым guid. Тогда row_number может присвоить каждой найденной строке «ранг», поэтому самый высокий столбец 1 будет иметь ранг 1:

select  *
from    (
        select  row_number() over (partition by t2.Column1, 
                    order by t2.id desc) as rn
        ,       *
        from    Table2 t2
        left join    
                Table1 t1
        on      t2.Table2FK = t1.id
                and t1.guid is not null
        ) as SubQueryAlias
where   rn = 1

Подзапрос необходим, поскольку SQL Server не разрешает row_number непосредственно в предложении where.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...