Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.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 如何避免在CASE中关联子查询?_Sql_Case_Correlated Subquery - Fatal编程技术网

Sql 如何避免在CASE中关联子查询?

Sql 如何避免在CASE中关联子查询?,sql,case,correlated-subquery,Sql,Case,Correlated Subquery,假设我们有这四张表: create table_x(x编号,title varchar2(100)); 创建表格y(y编号,x编号,标题varchar2(100)); 创建表格z(z编号、y编号、x编号、标题varchar2(100)); 创建表格(z编号、y编号、x编号); 需要根据以下规则为表\u main中的每一行获取标题: select case when z is not null then (select title from tabl

假设我们有这四张表:

create table_x(x编号,title varchar2(100));
创建表格y(y编号,x编号,标题varchar2(100));
创建表格z(z编号、y编号、x编号、标题varchar2(100));
创建表格(z编号、y编号、x编号);
需要根据以下规则为
表\u main
中的每一行获取
标题

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;
我正在寻找一种更具可读性的解决方案,以产生相同的结果

当语句与表连接或以其他方式连接时,是否有方法重构查询以替换案例?

我的方法是:

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   
我的做法是:

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   

这些是标量子查询。您可以使用三个左连接加上一个合并()来避免它们@joop似乎我们有相同的想法;-)这些是标量子查询。您可以使用三个左连接加上一个合并()来避免它们@joop似乎我们有相同的想法;-)