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
);