查询以基于est代码获取密钥或获取默认的estcode值

时间:2016-09-22 06:23:25

标签: sql oracle jpql

  +----+--------------+-----------+--------------++--------------+
| ID | KEY          | CODE      |    VALUE     |     ACTIVE    |
+----+--------------+-----------+--------------+---------------+
| 1  | MIN_VAL_EMP  | 111       |    100       |       Y       |
+----+--------------+-----------+--------------+---------------+
| 2  | MIN_VAL_MARR | 222       |    110       |       Y       |
+----+--------------+-----------+--------------+---------------+
| 3  | MIN_VAL_FOOD | 0         |    10        |       Y       |
+----+--------------+-----------+--------------+---------------+
| 4  | MAX_VAL_EMP  | 121       |    8000      |       Y       |
+----+--------------+-----------+--------------+---------------+
| 5  | MAX_VAL_MARR | 0         |    20        |       Y       |
+----+--------------+-----------+--------------+---------------+
| 6  | MAX_VAL_FOOD | 0         |    30        |       Y       |
+----+--------------+-----------+--------------+---------------+
| 7  | MIN_VAL_EMP  | 0         |    80        |       Y       |
+----+--------------+-----------+--------------+---------------+

需要编写查询,

如果我的CODE值存在,则获取该信息,如果不存在则获取那些带CODE的KEY为0。 此外,结果中不应存在重复的KEY,无论是带CODE的KEY还是默认的CODE(0)。两者都不会出现。 必须注意,所有这些规则仅适用于记录的ACTIVE = Y

例如,如果我的CODE是111。

结果将是,

+----+----+--------------+-----------+--------------+
| ID | KEY          | CODE      |    VALUE     |
+----+--------------+-----------+--------------+
| 1  | MIN_VAL_EMP  | 111       |    100       |
+----+--------------+-----------+--------------+
| 3  | MIN_VAL_FOOD | 0         |    10        |
+----+--------------+-----------+--------------+
| 5  | MAX_VAL_MARR | 0         |    20        |
+----+--------------+-----------+--------------+
| 6  | MAX_VAL_FOOD | 0         |    30        |
+----+--------------+-----------+--------------+

这里,下面的行不会是结果的一部分,因为我们带有CODE 111的KEY。

| 7  | MIN_VAL_EMP  | 0         |    80        |

3 个答案:

答案 0 :(得分:1)

您可以使用

中的位置
select distinct id, key, code, value
frm my_table 
where (key,code) in (select key, max(code) 
                    from my_table where code = 111 or code = 0 
                    group by key)

答案 1 :(得分:0)

您可以使用以下查询:

SELECT ID, KEY, CODE, VALUE
FROM (
  SELECT ID, KEY, CODE, VALUE,
         ROW_NUMBER() OVER (PARTITION BY KEY 
                            ORDER BY CASE 
                                        WHEN KEY = 111 THEN 1
                                        ELSE 2
                                     END) rn
  FROM mytable
  WHERE ACTIVE = 'Y' AND CODE IN (111, 0)) t
WHERE t.rn = 1

答案 2 :(得分:0)

select t.id, t.key,t.code, t.value from table t
where t.code= 111 and t.active = 'y'
union
select t.id, t.key,t.code, t.value from table t
where t.code= 0 and t.key not in 
(
  select t.key from table t
  where t.code= 111 and t.active = 'y'
)

这应该有效