Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle:嵌套联接/子查询:奇数列名和一个无法解释的错误_Sql_Oracle_Join_Nested_Subquery - Fatal编程技术网

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, ...