sql - Oracle 联合多个具有相同子查询的表
问题描述
我有一个效率低下的 Oracle SQL 查询,其中包含多个子查询联合(大约 7 或 8 个表),它们的区别仅在于子查询中查询的表,我确信可以更简洁地编写。观察底部的代码,联合子查询之间的唯一区别是表名(在本例中为 table_a / table_b)。
SELECT
/*+ parallel(10) */
Col_Alpha,
Col_Beta,
Col_Gamma,
Col_Delta,
col_epsilon
FROM
table_a
WHERE
Col_Theta = 'CAT'
And Col_Kappa In ('CAR','TRUCK','PLANE')
UNION
SELECT
/*+ parallel(10) */
Col_Alpha,
Col_Beta,
Col_Gamma,
Col_Delta,
col_epsilon
FROM
table_b
WHERE
Col_Theta = 'CAT'
AND col_kappa IN ('CAR','TRUCK','PLANE')
我尝试在 from 子句之后给出表列表,但这不起作用。我还添加了以下变体:
from
(table_a, table_b)
那没有用。我试图找到一种压缩代码的方法,但我对成功搜索的了解还不够。我无法使用我的访问级别的程序。
我希望输出类似于我得到的输出,几个表的联合,查询相同的列和所有这些表的相同过滤器,但这需要大约 1/7 的代码量。
解决方案
不幸的是,您无法摆脱多个 SELECT 语句。根据 Oracle 的说法,UNION 的工作方式是:“您可以使用集合运算符 UNION、UNION ALL、INTERSECT 和 MINUS组合多个查询。”
换句话说,您需要有多个查询才能将它们联合起来。
但是您可以将条件移到 UNION 之外,这样您只需重复一次:
SELECT * FROM(
Select col1, col2, col3 FROM table_1 UNION
Select col1, col2, col3 FROM table_2 UNION
Select col1, col2, col3 FROM table_3 UNION
Select col1, col2, col3 FROM table_4)
WHERE Col_Theta = 'CAT'
AND Col_Kappa In ('CAR','TRUCK','PLANE');
你也可以在最后加上 ORDER BY 和其他条件。这并没有消除所有的重复,但至少可以做到,如果你改变 WHERE 条件,你只会在一个地方改变它们。
推荐阅读
- snowflake-cloud-data-platform - 可以在事务中执行访问权限语句吗?
- ocaml - 此表达式具有单元类型,但表达式应为字符串类型
- reactjs - 如何使用是的验证 firstName 中的每个字符?
- c# - .net core 3.0 使用 Policy、AuthenticationSchemes 授权属性
- pandas - 大熊猫中日期时间列的分组最后值
- string - Google Scripts 错误 SyntaxError: Unexpected token < (line 119, file "Code")
- python - 如何将shell输出转换为python字典
- java - 在java中将拉丁语1补充unicode转换为字符串
- macos - 从启动服务中隐藏 NSDocument 子类
- excel - 复制参数不适用于 Range 对象