我有一个问题:
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条目。理想情况下我还有另一个查询我可以用来指定特定的条目(而不是最大值)。
答案 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
);