【问题标题】:oracle scalar subquery?oracle 标量子查询?
【发布时间】:2011-11-10 16:46:00
【问题描述】:

我有这样一张桌子:

 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 个实体;
  2. 此条目必须在value1这组value2中具有最大值;
  3. 该条目在value2 组中的最大值必须为value3

在互联网上搜索后,我得到了一个解决方案,将SELECT列表中的标量子查询作为单个列,但它非常丑陋和复杂,因为必须为每个列运行相同的子查询@ 987654330@, value2, value3.

SQL Cookbook 提到了配方 14.10 中通过将类型定义为对象的解决方案,但我更喜欢单个 SELECT 语句中的解决方案。

有什么简单的方法吗?

【问题讨论】:

    标签: sql oracle subquery analytics scalar-subquery


    【解决方案1】:

    在这种情况下,分析是您的朋友:

    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
    

    【讨论】:

    • 非常感谢!漂亮又快速!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-13
    • 1970-01-01
    相关资源
    最近更新 更多