Nic*_*tti 1 sql oracle oracle9i
我有这个问题
SELECT
CASE WHEN EXISTS (SELECT PARM_VALUE
FROM BO_PARM
WHERE (ENTE_CD = '7316')
AND PARM_CD = 'PAGINAZIONE_PROMOZIONI')
THEN p2.PARM_VALUE
ELSE p1.PARM_VALUE
END as RIGHE
FROM
(SELECT PARM_VALUE
FROM BO_PARM
WHERE (ENTE_CD = '0000' OR ENTE_CD = 'XXXX')
AND PARM_CD = 'PAGINAZIONE_PROMOZIONI') p1,
(SELECT PARM_VALUE
FROM BO_PARM
WHERE (ENTE_CD = '7316')
AND PARM_CD = 'PAGINAZIONE_PROMOZIONI') p2
Run Code Online (Sandbox Code Playgroud)
基本上我想在第二个查询至少有一行时返回第二个查询的值,否则返回第一个查询的结果.现在这些是返回值:
SELECT PARM_VALUE
FROM BO_PARM
WHERE (ENTE_CD = '7316')
AND PARM_CD = 'PAGINAZIONE_PROMOZIONI' //No retrun
SELECT PARM_VALUE
FROM BO_PARM
WHERE (ENTE_CD = '0000' OR ENTE_CD = 'XXXX')
AND PARM_CD = 'PAGINAZIONE_PROMOZIONI' //returns 10
SELECT
CASE WHEN EXISTS (SELECT PARM_VALUE
FROM BO_PARM
WHERE (ENTE_CD = '7316')
AND PARM_CD = 'PAGINAZIONE_PROMOZIONI')
THEN p2.PARM_VALUE
ELSE p1.PARM_VALUE
END as RIGHE
FROM
(SELECT PARM_VALUE
FROM BO_PARM
WHERE (ENTE_CD = '0000' OR ENTE_CD = 'XXXX')
AND PARM_CD = 'PAGINAZIONE_PROMOZIONI') p1,
(SELECT PARM_VALUE
FROM BO_PARM
WHERE (ENTE_CD = '7316')
AND PARM_CD = 'PAGINAZIONE_PROMOZIONI') p2 //no return, i was expecting 10
Run Code Online (Sandbox Code Playgroud)
我在CASE声明中做错了什么?
小智 5
您现有的查询在两个子查询之间有一个隐含的笛卡尔连接 - 这意味着当一个查询返回n行而另一个返回m行时,您将看到返回的总共m*n行 - 即.第一组中每行的每个组合以及第二组中的行.
因此,如果在任一集中返回0行,您将看到总共返回0行.
假设查询都不应该返回多行,那么修改后的查询的最简单版本可能如下:
SELECT coalesce(
(SELECT PARM_VALUE FROM BO_PARM WHERE (ENTE_CD = '7316') AND PARM_CD = 'PAGINAZIONE_PROMOZIONI'),
(SELECT PARM_VALUE FROM BO_PARM WHERE (ENTE_CD = '0000' OR ENTE_CD = 'XXXX') AND PARM_CD = 'PAGINAZIONE_PROMOZIONI')
)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
536 次 |
| 最近记录: |