【问题标题】:SQL Keep (dense_rank last order by) to H2 databaseSQL Keep(dense_rank last order by)到 H2 数据库
【发布时间】:2015-06-17 01:48:46
【问题描述】:

我有以下选择语句

SELECT c.car_id
MAX(m.mod_number) KEEP (DENSE_RANK LAST ORDER BY
DECODE(m.mod_number 'SP1', 10, 'SP2', 20, 'SP3', 30, 40))
FROM CAR c, MANUFACTURE m
WHERE c.car_type = m.car_type
AND m.make LIKE 'FOR%'
GROUP BY c.car_id;

我想将其更改为 H2 语法以进行单元测试,但我只能进行解码。我不知道如何使用 keep (dense_rank...) 进行修改,如何在保留 Oracle 的 select 语句功能的同时做到这一点?

【问题讨论】:

  • 保留 Oracle 的功能到底是什么意思? KEEP 通常被替换为自连接(即您从同一个表中选择两次)。尽管@Nicks 技巧非常好,但它可能没有与 orinal 查询相同的性能(PS:DECODE 应该重写为CASE WHEN)。

标签: sql oracle h2


【解决方案1】:

我认为这可能有效:

SELECT c.car_id,
       (CASE MAX(CASE WHEN m.mod_number = 'SP1' THEN 10
                      WHEN m.mod_number = 'SP2' THEN 20
                      WHEN m.mod_number = 'SP3' THEN 30
                      ELSE 40
                  END)
             WHEN 10 THEN 'SP1'
             WHEN 20 THEN 'SP2'
             WHEN 30 THEN 'SP3'
             ELSE MAX(CASE WHEN m.mod_number NOT IN ('SP1', 'SP2', 'SP3') THEN m.mod_number
                      END)
       END)
FROM CAR c JOIN
     MANUFACTURE m
     ON c.car_type = m.car_type
WHERE m.make LIKE 'FOR%'
GROUP BY c.car_id;

它计算最大优先级,然后将值映射回原始值。

【讨论】:

    【解决方案2】:

    最接近的等价物是这样的:

    SELECT 
    c.car_id
    SUBSTRING(
        MAX(
            DECODE(m.mod_number 'SP1', '10', 'SP2', '20', 'SP3', '30', '40')) 
            || 
            TO_CHAR(m.mod_number)
        ),
    3,100) NewField
    FROM CAR c, MANUFACTURE m
    WHERE c.car_type = m.car_type
    AND m.make LIKE 'FOR%'
    GROUP BY c.car_id;
    

    KEEP 是一种在与您使用的实际记录集不同的基础(顺序)上从许多记录中挑选单个记录的方法。幸运的是,这个特定的查询不一定需要它。

    在尝试转换为 H2 之前先在 Oracle 中尝试此操作

    【讨论】:

      猜你喜欢
      • 2020-08-06
      • 1970-01-01
      • 2015-03-27
      • 1970-01-01
      • 2019-01-03
      • 2011-04-10
      • 2019-11-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多