如何避免在 CASE WHEN 中关联子查询?
How to avoid correlating subqueries inside CASE WHEN?
假设我们有这四个 table:
create table table_x(x number, title varchar2(100));
create table table_y(y number, x number, title varchar2(100));
create table table_z(z number, y number, x number, title varchar2(100));
create table table_main(z number, y number, x number);
需要根据规则table_main
中的每一行获取title
:
select
case
when z is not null
then (select title from table_z where x = tm.x and y = tm.y and z = tm.z)
when y is not null
then (select title from table_y where x = tm.x and y = tm.y)
when x is not null
then (select title from table_x where x = tm.x)
end as title
from table_main tm;
我正在寻找产生等效结果的更具可读性的解决方案。
有没有办法重构查询,用 table 连接或其他方式替换 case when
语句?
我的方法是:
SELECT COALESCE(tz.title, ty.title, tx.title) AS mytitle
FROM table_main tm
LEFT OUTER JOIN table_x tx
ON tx.x_number = tm.x_number
LEFT OUTER JOIN table_y ty
ON ty.x_number = tm.x_number
AND ty.y_number = tm.y_number
LEFT OUTER JOIN table_z tz
ON tz.x_number = tm.x_number
AND tz.y_number = tm.y_number
AND tz.z_number = tm.z_number
假设我们有这四个 table:
create table table_x(x number, title varchar2(100));
create table table_y(y number, x number, title varchar2(100));
create table table_z(z number, y number, x number, title varchar2(100));
create table table_main(z number, y number, x number);
需要根据规则table_main
中的每一行获取title
:
select
case
when z is not null
then (select title from table_z where x = tm.x and y = tm.y and z = tm.z)
when y is not null
then (select title from table_y where x = tm.x and y = tm.y)
when x is not null
then (select title from table_x where x = tm.x)
end as title
from table_main tm;
我正在寻找产生等效结果的更具可读性的解决方案。
有没有办法重构查询,用 table 连接或其他方式替换 case when
语句?
我的方法是:
SELECT COALESCE(tz.title, ty.title, tx.title) AS mytitle
FROM table_main tm
LEFT OUTER JOIN table_x tx
ON tx.x_number = tm.x_number
LEFT OUTER JOIN table_y ty
ON ty.x_number = tm.x_number
AND ty.y_number = tm.y_number
LEFT OUTER JOIN table_z tz
ON tz.x_number = tm.x_number
AND tz.y_number = tm.y_number
AND tz.z_number = tm.z_number