不使用JOIN关键字的SQL转换(Oracle jpa)

不使用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

有没有办法不使用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.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吗?语法看起来无效。