【问题标题】:Use result of select query into another multiple times多次使用选择查询的结果到另一个
【发布时间】:2021-10-14 17:57:40
【问题描述】:

我有一个使用 INTERSECT 执行的复杂选择查询 (Query-1),它返回特定列的 ID。

查询 #1:

SELECT my_id FROM my_table
INTERSECT
SELECT my_id FROM other_table;

现在还有另一个更复杂的查询,它需要多次查询 #1 的结果。

查询 #2:

SELECT * 
FROM
    (SELECT my_id, col_1, my_value
     FROM my_table
     WHERE my_id IN (result from query-1) 
       AND col_3 IN (SELECT col_3 FROM another_table1 
                     WHERE my_id IN (result from query-1) 
                       AND another_col IN (SELECT another_col 
                                           FROM another_table2 
                                           WHERE my_id IN (result from query-1))))
    PIVOT 
        (MIN(my_value)
            FOR(col_1) IN(1 AS name, 2 AS lastname, 3 AS address)
        )

正如您所见,query-1 的结果在 query-2 中需要多次,我尝试的是在任何需要的地方替换 query-2 中的整个 query-1,这会增加查询的复杂性和可读性。

有没有办法以简单的方式做到这一点?

【问题讨论】:

  • 已经有一个答案告诉您正确的方法 - 使用 with 子句。这还有另一个好处:在您的尝试中,您在多个地方内联相同的(子)查询,Oracle 不够聪明,无法检查它是否是相同的子查询;它会多次计算你的交点。使用with 子句,如果它被多次使用,Oracle 可能会决定 - 无需您的干预 - 更有效地实现子查询的结果,以便它只计算一次并且输出被重复使用。

标签: sql oracle subquery-factoring


【解决方案1】:

如何使用with 子句(子查询分解子句):

with query-1 as (SELECT my_id FROM my_table
INTERSECT
SELECT my_id FROM other_table)

SELECT * FROM
(
   SELECT my_id, col_1, my_value
   FROM my_table
   WHERE my_id IN (select id from query-1) AND col_3 IN
      (SELECT col_3 FROM another_table1 WHERE my_id IN (select id from query-1) AND another_col IN
         (SELECT another_col FROM another_table2 WHERE my_id IN (select id from query-1))
)
)
PIVOT (
   MIN(my_value)
   FOR(col_1)
   IN(1 AS name, 2 AS lastname, 3 AS address)
)

【讨论】:

  • query-1 不是一个有效的标识符(留给你思考为什么)。
【解决方案2】:

对于您将多次使用的任何查询,我肯定会使用 View。

我先写下面的代码:

Create View Query1
as
SELECT my_id FROM my_table
INTERSECT
SELECT my_id FROM other_table;

一旦我选择了上面的代码,我将执行 (F5) 它。这将存储视图。然后我将编写下面的代码并在你想调用它时执行:

Select * From Query1

或者您可以简单地在 Query2 中使用 Query1。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-18
    • 2015-12-22
    • 1970-01-01
    • 2018-03-08
    • 1970-01-01
    • 2016-11-14
    相关资源
    最近更新 更多