Sql Oracle:嵌套联接/子查询:奇数列名和一个无法解释的错误
以下查询工作正常。这是一系列嵌套联接,为我提供了一种主表:Sql Oracle:嵌套联接/子查询:奇数列名和一个无法解释的错误,sql,oracle,join,nested,subquery,Sql,Oracle,Join,Nested,Subquery,以下查询工作正常。这是一系列嵌套联接,为我提供了一种主表: SELECT * FROM proj_trainer k JOIN ( SELECT * FROM proj_breeder i JOIN ( SELECT * FROM proj_jockey g JOIN ( SELECT * FROM proj_horses e JOIN
SELECT *
FROM proj_trainer k
JOIN
(
SELECT *
FROM proj_breeder i
JOIN
(
SELECT *
FROM proj_jockey g
JOIN
(
SELECT *
FROM proj_horses e
JOIN
(
SELECT *
FROM proj_results c
JOIN
(
SELECT *
FROM proj_race_details a
JOIN proj_meet b
ON a.meet_id = b.meet_id
) d
ON c.race_id = d.race_id
) f
ON e.horse_id = f.horse_id
) h
ON g.jockey_id = h.jockey_id
)j
ON i.breeder_id = j.breeder_id
) l
ON k.trainer_id = l.trainer_id;
这在一个奇怪的特性上运行良好,这不是我的主要问题。有些列返回时带有奇怪的代码,如“QCSJ_C0000000013000001”。不知道为什么,或者这是否与我的实际问题有关
真正的问题是,当我再添加一个join子查询时,我得到:
ORA-00904: "N"."RACE_ID": invalid identifier
下面是与额外嵌套块(最外面的块)相同的代码
我感觉这一次我已经越过了山头,然后最后一条线不知怎么地出了问题,尽管它的结构与之前所有的街区几乎相同。我在代码的前面也使用了race\u id和horse\u id,所以它们可以工作
我在最后一行也试过:
ON n.race_id = m.race_id AND n.horse_id = m.horse_id;
还有一些其他的变体,用括号等等…起初我看不出有什么错误,但后来我也看不出有什么非常好的语法!问题可能是
“N”。“RACE\u ID”
不明确,因为“N”
是连接多个表的查询的别名,其中可能有多个表具有RACE\u ID
列
您的SQL可以重新编写为:
SELECT *
FROM proj_entry m
JOIN proj_trainer n ON n.race_id = m.race_id
JOIN proj_breeder l ON l.trainer_id = n.trainer_id
JOIN proj_jockey j ON j.breeder_id = l.breeder_id
JOIN proj_horses h ON h.jockey_id = j.jockey_id
JOIN proj_results f ON f.horse_id = h.horse_id
JOIN proj_race_details d ON d.race_id = f.race_id
JOIN proj_meet b ON b.meet_id = d.meet_id
WHERE n.horse_id = m.horse_id;
(但我可能在某个地方犯了个错误。)
对我来说,这看起来简单多了。如果别名是实际表名的助记符,而不是大多数情况下字母表中的任意字母,则更好:
SELECT *
FROM proj_entry e
JOIN proj_trainer t ON t.race_id = e.race_id
JOIN proj_breeder b ON b.trainer_id = n.trainer_id
JOIN proj_jockey j ON j.breeder_id = b.breeder_id
JOIN proj_horses h ON h.jockey_id = j.jockey_id
JOIN proj_results r ON r.horse_id = h.horse_id
JOIN proj_race_details d ON d.race_id = r.race_id
JOIN proj_meet m ON m.meet_id = d.meet_id
WHERE t.horse_id = e.horse_id;
然后,您应该能够轻松地检查联接,以查看它们是否位于正确的列上。现在,如果您得到一个错误,如ORA-00904:“T”。“RACE_ID”:无效标识符
,您将肯定地知道它指的是表proj_trainer
,而以前的“N”。“RACE_ID”
可能是不明确的,因为“N”是连接大约六个表的查询的别名
另外,与其选择*,不如指定所需的实际列,这样可以避免重复,例如:
SELECT e.race_id, t.trainer_id, t.trainer_name, ...
(我认为您的查询工具生成的以“QCSJ”开头的列名是为了处理结果中可能出现的重复列名。什么是查询工具?谢谢。你的方法奏效了,我也没有得到任何奇怪的列名。事实上,我之所以嵌套它们,是因为我认为这是必要的。当然更容易阅读/实现。您知道我如何选择块顶部的所有者,并在其为多个所有者时仅返回一个所有者(任何所有者)?我正在考虑使用MIN(I.owner\u id)作为select,并在最后附加到block:groupby(I.owner\u id)。这是我最大的努力,但它相当差劲。您可以这样做:
从中选择不同的所有者…
请参阅DocId 2658003.1“QCSJ_C”
在Oracle转换ANSI样式联接时在内部使用。
SELECT e.race_id, t.trainer_id, t.trainer_name, ...