2012-05-28 74 views
3

比方說,我需要找到每個動物園中最古老的動物。這是一種典型的最大一類查詢。這只是一個複雜因素:斑馬和長頸鹿被存放在不同的桌子上。爲了讓所有動物的上市,無論是長頸鹿和斑馬,我可以這樣做:子查詢的結果可以與其自身結合嗎?

(SELECT id,zoo,age FROM zebras 
UNION ALL 
SELECT id,zoo,age FROM giraffes) t1 

然後給出t1,我可以建立一個典型的最大對的一組查詢:

SELECT t1.* 
FROM t1 
JOIN 
(SELECT zoo,max(age) as max_age 
FROM t1 
GROUP BY zoo) t2 
ON (t1.zoo = t2.zoo) 

很明顯,我可以將t1作爲臨時表存儲,但有沒有辦法在一個查詢中完成此操作,而無需重複定義t1? (請不要討論對錶格設計的修改;我想專注於使用子查詢結果的問題。)

+0

您所查詢的是奇怪的,這是一樣的做 SELECT T1 * FROM T1 因爲T2將包含所有可能的動物園。 t1,你加入t1的動物園與t1本身... – Sebas

回答

2

這裏是with子句的鏈接。

Understanding the WITH Clause

with t1 as 
(select id, zoo, age from zebras 
union all 
select id, zoo, age from giraffes) 
select t1.* 
from t1 
join 
(SELECT zoo,max(age) as max_age 
FROM t1 
GROUP BY zoo) t2 
on (t1.zoo = t2.zoo); 

注意:您可以用第T2移動到你爲好。

注2:另一種解決方案是簡單地創建t1作爲視圖,然後在查詢中使用它。

+0

我認爲這不是真正的SQL標準兼容 編輯:ups,是的,它是:-)不知道1999年的一個...... sry! – Sebas

+0

我確實認爲'WITH'是要走的路。然而,它似乎MySQL(我最常使用的RDBMS)[可能不支持它](http://stackoverflow.com/questions/324935/mysql-with-clause)?如果這仍然是真的,那麼就是Frowny的臉。 – gcbenison

0

要找到最古老的動物,你應該使用wjndoq功能:

select z.* 
from (select z.*, 
      row_number() over (partition by zoo order by age desc) as seqnum 
     from (<subquery to union all animals>) z 
    ) 
where seqnum = 1 
相關問題