2011-09-10 30 views
2

我有一個表t1和t2,我加入並命令形成數據集set1。選擇具有特定值的行之後的所有行而不重複相同的子查詢

兩列c1和c2形成set1中行的唯一標識符。

我想從第一行之後的set1中獲取所有值,並使用特定的c1和c2。

我有一個像下面這工作的一個查詢,但它重複相同的子查詢兩次,這甚至對甲骨文似乎是多餘的,過於複雜:

SELECT * FROM 
(
    SELECT row_number() OVER (ORDER BY c1, c3) myOrder, c1, c2, c3 
    FROM t1, t2 
    WHERE condition 
    ORDER BY conditions 
) sub1, 
(
    SELECT sub1_again.myOrder FROM 
    (
    SELECT row_number() OVER (ORDER BY c1, c3) myOrder, c2, c3 
    FROM t1, t2 
    WHERE condition 
    ORDER BY conditions 
) sub1_again 
    WHERE sub1_again.c2 = "foo" AND sub1_again.c3 = "bar" 
) sub2 
WHERE sub1.myOrder >= sub2.myOrder 
ORDER BY sub1.myOrder 

好像SQL將有一個簡單的方法來做到這一點,但我不知道要搜索什麼。 有沒有更乾淨的方法來做到這一點?

回答

2
SELECT * FROM (
    SELECT row_number() OVER (ORDER BY c1, c3) myOrder, c2, c3 
     ,CASE WHEN c2 = "foo" AND c3 = "bar" 
       THEN row_number() OVER (ORDER BY c1, c3) 
     END target_rn 
    FROM t1, t2 
    WHERE condition 
    ORDER BY conditions 
) WHERE myOrder > target_rn; 
+0

這是一個回答我的問題,雖然我結束了不使用它因爲我真正的查詢(不是我上面使用的那個)從case語句派生出條件語句(c2 =「foo」AND c3 =「bar」),所以在我的真實而不是過於簡化的示例中使用此示例將需要case語句在案件陳述中,這並沒有看起來更漂亮。 –

+0

無論你做什麼,主要原則是隻運行一次主查詢。 –

0

請嘗試更加具體,如果我深知你剛纔添加參數「其中」,比如:SELECT * FROM **where** element

相關問題