2011-11-10 5 views
1

私はそのようなテーブルを持っている:私は必要なものoracleスカラーサブクエリ?

name value1 value2 value3 
--------------------------- 
name1 1  1  1 
name2 1  1  2 
name3 2  2  11 
name4 2  12  2 
name5 3  3  8 
name6 3  3  2 

は、そのような結果である:

name value1 value2 value3 
--------------------------- 
name2 1  1  2 
name4 2  12  2 
name5 3  3  8 

すなわち:

  1. value1の各グループのために正確な1 enty。
  2. このグループの最大値はvalue2で、value1です。
  3. このエントリのグループの最大値はvalue3で、value2である必要があります。インターネットで検索した後

、私は単一列としてSELECTリストにスカラー副問合せを使用して解決策を持っているが、同じサブクエリが列ごとに実行する必要がありますので、それは、非常に醜いと複雑ですvalue1,value2,value3

SQL Cookbookは、タイプをオブジェクトとして定義することでレシピ14.10の解決策を述べていますが、私は単一のSELECTステートメントで解決策を選びます。

簡単な方法はありますか?

答えて

1

Analyticsはあなたの友人は、この場合には、次のとおりです。

SQL> CREATE TABLE t (NAME VARCHAR2(32), v1 INTEGER, v2 INTEGER, v3 INTEGER); 

Table created 
SQL> INSERT INTO t VALUES ('name1',1,1,1); 

1 row inserted 
SQL> INSERT INTO t VALUES ('name2',1,1,2); 

1 row inserted 
SQL> INSERT INTO t VALUES ('name3',2,2,11); 

1 row inserted 
SQL> INSERT INTO t VALUES ('name4',2,12,2); 

1 row inserted 
SQL> INSERT INTO t VALUES ('name5',3,3,8); 

1 row inserted 
SQL> INSERT INTO t VALUES ('name6',3,3,2); 

1 row inserted 
SQL> SELECT NAME, v1, v2, v3 
     FROM (SELECT NAME, v1, v2, v3 
        , MAX(v2) OVER(PARTITION BY v1) mv2 
        , MAX(v3) OVER(PARTITION BY v1,v2) mv3 
       FROM t) 
     WHERE v2 = mv2 
     AND v3 = mv3 
     ORDER BY v1; 

NAME V1 V2 V3 
------ -- -- -- 
name2 1 1 2 
name4 2 12 2 
name5 3 3 8 
+0

どうもありがとう!美しくて速い! – chance