我有这些表(在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行。
答案 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
。