首页 > 解决方案 > 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 的代码量。

标签: sqloraclerefactoringunion

解决方案


不幸的是,您无法摆脱多个 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 条件,你只会在一个地方改变它们。


推荐阅读