2011-03-24 60 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