【发布时间】: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