2011-03-24 61 views
1

我有这些表(在SQL-Server 2008 R2中):SQL:聚合与空检查后加入

表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上汇总的查询,并将其与Table1行一起加上最大ID,但包含Table1.Guid的非空值。在这种情况下,它应该加入表1的第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

您还没有指定在输出结果集中您实际期望的列 – Aadith 2011-03-24 09:43:22

+0

我在select子句中放入的那些(基本上全部是这些) – 2011-03-24 09:46:27

+0

不是table2fk在table1中引用id的外键吗?如果是的话,为什么你会希望他们两个都列在结果中..我会建议思考一点问题,并细化你的问题陈述以获得更好的回应 – Aadith 2011-03-24 09:52:23

回答

2

您可以使用外部联接来匹配具有非空的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子句中的子查询是必需的。

+0

I认为你在你的答案中切换了“Table1”和“Table2”。如果将它们切换回来,我几乎可以得到我想要的结果,但它返回2行,因为它连接了两个表的前两行,我希望它返回第二行'Table1'的连接结果,第二行(即'Table1'的最大'Id',其中'Guid''不为空'由'Table1'的'Column1'分组)。 – 2011-03-24 09:38:38

+0

@Rian Schmits:你可以在'Column1'而不是'id'上分区,在答案中编辑。 – Andomar 2011-03-24 09:51:43

+0

完全按照我希望的那样工作,谢谢。 – 2011-03-24 10:25:49