Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.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 寻找建议:如果我能在我的查询中避免所有的联合?_Sql_Oracle11g - Fatal编程技术网

Sql 寻找建议:如果我能在我的查询中避免所有的联合?

Sql 寻找建议:如果我能在我的查询中避免所有的联合?,sql,oracle11g,Sql,Oracle11g,我有一个名为SOURCE\u table的表,其中有3列特定于一天,表示周日的SUN\u W、SUN\u WA和SUN\u WB,周一重复为MON\u W、MON\u WA和MON\u WB等,总共有3 x 7=21列 有没有更好的方法重写下面的查询并避免使用UNIONALL SELECT * FROM (SELECT /*+ parallel(scr,10) parallel(el,10) */ scr.rowid AS "row_

我有一个名为
SOURCE\u table
的表,其中有3列特定于一天,表示周日的SUN\u W、SUN\u WA和SUN\u WB,周一重复为MON\u W、MON\u WA和MON\u WB等,总共有3 x 7=21列

有没有更好的方法重写下面的查询并避免使用UNIONALL

      SELECT * FROM
      (SELECT 
      /*+ parallel(scr,10)
          parallel(el,10)  */ scr.rowid  AS "row_id", scr.*
      FROM SOURCE_TABLE scr
      LEFT OUTER JOIN CITY el ON (el.CITY_NAME  = scr.SUN_W)
      WHERE (el.ROWID IS NOT NULL AND scr.SUN_W IS NOT NULL
      AND GREATEST(scr.SUN_WA, scr.SUN_WB ) IS NULL)
      OR (el.ROWID IS NULL AND scr.SUN_W IS NOT NULL)

      UNION ALL

      SELECT 
      /*+ parallel(scr,10)
          parallel(el,10)  */ scr.rowid  AS "row_id", scr.*
      FROM SOURCE_TABLE scr
      LEFT OUTER JOIN CITY el ON (el.CITY_NAME  = scr.MON_W)
      WHERE (el.ROWID IS NOT NULL AND scr.MON_W IS NOT NULL
      AND GREATEST(scr.MON_WA, scr.MON_WB ) IS NULL)
      OR (el.ROWID IS NULL AND scr.MON_W IS NOT NULL)


      UNION ALL

      SELECT 
      /*+ parallel(scr,10)
          parallel(el,10)  */ scr.rowid  AS "row_id", scr.*
      FROM SOURCE_TABLE scr
      LEFT OUTER JOIN CITY el ON (el.CITY_NAME  = scr.TUE_W)
      WHERE (el.ROWID IS NOT NULL AND scr.TUE_W IS NOT NULL
      AND GREATEST(scr.TUE_WA, scr.TUE_WB ) IS NULL)
      OR (el.ROWID IS NULL AND scr.TUE_W IS NOT NULL)

      UNION ALL 

      ...

      )

一两个可能有帮助,也可能没有帮助的建议。看一看、测试、决定

这:

我觉得很可疑。为什么要测试
ROWID是否为NULL
?它不能为空,对吗?因此,它可以缩短为

WHERE scr.sun_w is not null 
  AND greatest(scr.sun_wa, scr.sun_wb) is null
此外,如果一个(或两个)参数是
NULL
,则
magest
将是
NULL
,因此它将是

WHERE scr.sun_w is not null
  AND (   scr.sun_wa is null 
       OR scr.sun_wb is null
      )
我不知道哪一个会表现得更好。如果
grest
工作正常,就不要管它,尽管你要找的东西并不那么明显


我不确定这是否等同于您的查询(无法测试,没有您的数据),但是-看看它是否有意义(包含截至周二的列):


查询无效<代码>cns未定义。@GordonLinoff更新了问题,这是一个打字错误!!谢谢@Littlefoot这个建议很有帮助!
WHERE scr.sun_w is not null
  AND (   scr.sun_wa is null 
       OR scr.sun_wb is null
      )
select *
from source_table scr left outer join city el 
  on el.city_name in (scr.sun_w, scr.mon_w, scr.tue_w)
where 
  (    scr.sun_w is not null
   and greatest(scr.sun_wa, scr.sun_wb) is null
  )
  or
  (    scr.mon_w is not null
   and greatest(scr.mon_wa, scr.mon_wb) is null
  )
  or
  (    scr.tue_w is not null
   and greatest(scr.tue_wa, scr.tue_wb) is null
  );