如何将子查询移动到WITH语句

时间:2014-11-26 22:15:20

标签: sql oracle

我有一个问题:

SELECT *
FROM app_interfaces
WHERE ROWID IN (
    SELECT MAX (ROWID)
    FROM app_interfaces
    WHERE version <= (SELECT MAX (version) AS v FROM app_interfaces)
    GROUP BY id);

我不确定这是否是正确的&#34;编写此查询的方法,我尝试使用Oracle的WITH子句,如下所示:

WITH latest_version AS (
SELECT MAX(version) AS v FROM app_interfaces )
SELECT *
FROM app_interfaces
WHERE ROWID IN (  
    SELECT MAX (ROWID)
    FROM app_interfaces
    WHERE version <= latest_version.v
    GROUP BY id);

你能告诉我A)哪种技术效率更高? B)为什么第二种技术(带有)不正确?

[编辑]

此查询的目的如下:

我有一个模型,其中每个条目都与一个&#39;版本相关联。 (因此app_interfaces模型中的一个实体可能有多个版本)。但是,这些版本是根据日期确定的,因此它们不一定是顺序的(我可能有1402,1403,1407等)。

如果我正在查看我的模型的X版本,我想查看版本X的所有条目或不具有该版本号的实体的下一个最新版本。

因此,如果应用A具有版本1402,1403和1407的条目;和应用程序B有版本1402和1405的条目,我查询最新版本(1407),我希望得到应用程序A的1407条目和应用程序B的1405条目。理想情况下我还有另一个查询我可以用来指定特定的条目(而不是最大值)。

1 个答案:

答案 0 :(得分:1)

不,不是。您需要在from子句中提及CTE:

WITH latest_version AS (
      SELECT MAX(version) AS v FROM app_interfaces
     )
SELECT *
FROM app_interfaces
WHERE ROWID IN (SELECT MAX(ROWID)
                FROM app_interfaces
                WHERE version <= (SELECT v FROM latest_version)
                GROUP BY id
               );

除非version可以NULL,否则比较不会做任何事情。因此,您的查询等同于:

SELECT *
FROM app_interfaces
WHERE ROWID IN (SELECT MAX(ROWID)
                FROM app_interfaces
                GROUP BY id
               );

SELECT *
FROM app_interfaces
WHERE ROWID IN (SELECT MAX(ROWID)
                FROM app_interfaces
                WHERE version IS NOT NULL
                GROUP BY id
               );