【发布时间】:2016-03-01 09:51:55
【问题描述】:
我有一个 SQL 查询,我需要在其中获取子查询的输出并多次使用它。我现有的查询有效,但前提是我每次需要时都重复子查询。不幸的是,子查询很复杂,并且需要时间来执行 - 这意味着多次迭代确实会减慢整个过程。
我读到您可以使用“WITH”语句将子查询输出分配给变量,以便重新使用该变量。但是我遇到的问题是在子查询中,我需要引用主查询中的值。看来,如果我在主查询 SELECT 之前使用 WITH - 那么这些引用将无法识别。我给你一个简化的例子:
WITH
DateX AS
(
SELECT
MAX(TableSub.Date)
FROM
TableA TableSub
WHERE
TableSub.ID = TableMain.ID
AND TableSub.Event = 'AnotherEvent'
AND TableSub.Date BETWEEN '01-Jan-2015' AND '31-Dec-2015'
)
SELECT
TableMain.ID
FROM
TableA TableMain
WHERE
TableMain.Event = 'MainEvent'
AND TableMain.Date >= DateX
AND (
SELECT
TableSub2.ID
FROM
TableA TableSub2
WHERE
TableSub2.ID = TableMain.ID
TableSub2.Event = 'ThirdEvent'
AND TableSub2.Date <= DateX
) IS NULL
我希望这很清楚。这是我所拥有的简化版本,但您可以看到 DateX 用于多个地方:在主查询中和子查询中。但是问题是当 DateX 由 WITH 定义时,我需要将 ID 链接回主查询的 ID。而且它不工作......
如果您对此提出任何建议,我将不胜感激。我做错了吗?有没有办法,或者只是不可能?如果是这样,那么我应该完全使用另一种方法吗?谢谢。
【问题讨论】:
-
请不要使用字符串文字来匹配日期 - 即
'01-Jan-2015'。它会在NLS_DATE_FORMATmatches 时工作(因为 Oracle 将使用该参数作为格式掩码执行隐式TO_DATE),但如果该参数发生更改,查询将失败(并且由于代码不会调试,因此会很痛苦) t 已经改变,但它会开始抛出异常)。最好使用 ANSI 日期文字 - 即DATE '2015-01-01'。 -
好的,感谢您提供有关日期格式的提示。知道如何回答这个问题吗? :)
标签: sql oracle subquery common-table-expression