SQL:使用null检查加入后进行聚合

时间:2011-03-24 08:52:24

标签: sql sql-server sql-server-2008

我有这些表(在SQL-Server 2008 R2中):

表1:

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

表2:

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

我想执行一个聚合超过Table2.Column1的查询,并将其连接到具有最大ID的Table1行,但包含Table1.Guid的非空值。在这种情况下,它应该连接到Table1的第2行。写作查询我想要这样的东西(虽然这不是有效的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行,在第二种情况下,它连接在Table1的第3行。

1 个答案:

答案 0 :(得分:2)

您可以使用外部联接来匹配具有非null guid的行。然后row_number可以为每个找到的行提供“等级”,因此最高的Column1将具有等级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