Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Keep(密集排列最后一个排序依据)到H2数据库_Sql_Oracle_H2 - Fatal编程技术网

SQL Keep(密集排列最后一个排序依据)到H2数据库

SQL Keep(密集排列最后一个排序依据)到H2数据库,sql,oracle,h2,Sql,Oracle,H2,我有以下选择语句 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语法进行单元测试,但我

我有以下选择语句

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(densite_rank…)进行修改。在保留Oracle的select语句功能的同时,我如何做到这一点?

我认为这可能有效:

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;

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

最接近的等效值如下:

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中尝试此功能

保留Oracle的功能到底意味着什么
KEEP
通常替换为自联接(即,您在同一个表中选择了两次)。尽管@Nicks技巧非常好,但它可能没有与原始查询相同的性能(PS:
DECODE
应该在时重写为
大小写)。