2009-01-14 22 views
1

我正在進行概率計算。我有一個查詢來計算事件發生的總次數。從這些事件中,我想知道一個子事件發生的次數。獲取總事件的查詢長度爲25行,我不想只複製+粘貼兩次。SQL - 在一條語句中將查詢結果用作另外兩個查詢的基礎

我想對此查詢做兩件事:計算其中的行數,並計算此查詢的查詢結果中的行數。現在,我能想到的唯一方法就是這樣(用帶有複雜查詢來替換所有行的條件替換@ total @,@條件@用條件複雜的條件@ total @中的行必須匹配子事件):

SELECT (SELECT COUNT(*) FROM (@[email protected]) AS t1 WHERE @[email protected]) AS suboccurs, 
     COUNT(*) AS totaloccurs FROM (@[email protected]) as t2 

正如您所看到的,@ total @會重複兩次。有沒有辦法解決?有沒有更好的方式來做我想做的事情?

重新強調:@條件@取決於@ total @返回的值(它的確如t1.foo = bar)。

一些最後的注意事項:@ total @本身需要〜250ms。這個更復雜的查詢需要〜300ms,所以postgres本身可能會進行一些優化。儘管如此,這個查詢看起來非常醜陋,@ total @直接粘貼了兩次。

回答

1
SELECT COUNT(*) as totaloccurs, COUNT(@[email protected]) as suboccurs 
FROM (@[email protected] as t1) 
+0

輝煌!實際上它的工作速度大約慢10-20毫秒,足夠有趣......但我更關心代碼的樣子,只需要做一個小小的編輯。 – Claudiu 2009-01-14 21:18:48

0

將重用的子查詢放入臨時表中,然後從臨時表中選擇您需要的內容。

6

如果您的sql支持子查詢因子分解,那麼使用WITH語句重寫它是一個選項。它允許子查詢不止一次使用。隨着將它們創建爲Oracle中的內聯視圖或臨時表。

這是一個人爲的例子。

WITH 
x AS 
(
    SELECT this 
    FROM THERE 
    WHERE something is true 
), 
y AS 
(
    SELECT this-other-thing 
    FROM somewhereelse 
    WHERE something else is true 
), 
z AS 
(
    select count(*) k 
    FROM X 
) 
SELECT z.k, y.*, x.* 
FROM x,y, z 
WHERE X.abc = Y.abc 
0

@EvilTeach:

我從來沒見過「同向」(可能不是Sybase :-(實現的)我喜歡:做你在一個塊需要的東西,然後消失,與即使不是臨時桌子,也沒有那麼粗糙,很酷......

相關問題