不使用JOIN关键字的SQL转换(Oracle jpa)
有没有办法不使用JOIN关键字重新编写以下内容?就像使用连接表的旧方法一样不使用JOIN关键字的SQL转换(Oracle jpa),sql,oracle,Sql,Oracle,有没有办法不使用JOIN关键字重新编写以下内容?就像使用连接表的旧方法一样 SELECT Routes.* FROM Routes JOIN (SELECT let,dir,min(num) as minnum FROM Routes GROUP BY let, dir ) ld JOIN Routes tt ON tt.let = ld.let AND tt.dir = ld.dir AND tt.num = ld.minnum AND Routes.le
SELECT Routes.* FROM Routes
JOIN (SELECT let,dir,min(num) as minnum
FROM Routes
GROUP BY let, dir
) ld JOIN Routes tt
ON tt.let = ld.let AND tt.dir = ld.dir AND tt.num = ld.minnum
AND Routes.let = ld.let AND Routes.dir = ld.dir
WHERE tt.ctry = 'CA';
这是正确编写的查询:
SELECT Routes.*
FROM Routes JOIN
(SELECT let, dir, min(num) as minnum
FROM Routes
GROUP BY let, dir
) ld
ON Routes.let = ld.let AND Routes.dir = ld.dir JOIN
Routes tt
ON Routes.let = ld.let AND Routes.dir = ld.dir AND tt.num = ld.minnum
WHERE tt.ctry = 'CA';
您似乎希望给定let
和dir
的所有路由都最小化num
。我不知道你的数据是什么样的,但这似乎是一个合理的等价物:
SELECT r.*
FROM (SELECT r.*, MIN(num) OVER (PARTITION BY let, dir) as minnum
FROM routes r
) r.*
WHERE r.ctry = 'CA'; AND num = minnum;
你在这里可不是有什么硬碰硬的。几乎所有您需要做的就是用逗号替换单词“JOIN”,并将所有连接条件下推到WHERE子句中。这就是传统Oracle语法中的精确查询:
SELECT Routes.*
FROM Routes
,(SELECT let,dir,min(num) as minnum
FROM Routes
GROUP BY let, dir
) ld
,Routes tt
WHERE tt.let = ld.let
AND tt.dir = ld.dir
AND tt.num = ld.minnum
AND Routes.let = ld.let
AND Routes.dir = ld.dir
AND tt.ctry = 'CA';
也就是说,这看起来肯定不是获取这些数据的最有效的方法。我会跳过表的第三次扫描,使用分区分析,就像Gordon一样 你为什么要这么做?但你为什么要这么做?!?嗯,是的,你可以用老方法,但是如果你知道的话,你就不知道为什么要问。为什么不想使用ANSI连接语法?
中缺少联接条件。。。ld JOIN Routes…
part,但用旧语法重写为“fix”,这只会生成笛卡尔积。也许你搞错问题了。。。?您的意思是只有一条路线,tt别名在第一行吗?您可能还想研究分析函数。您应该添加对代码正在执行的操作的描述,以及示例数据和所需结果。另外,您真的在使用Oracle吗?语法看起来无效。