Oracle:嵌套连接/子查询:奇数列名称和一个无法解释的错误

时间:2014-04-14 01:51:10

标签: 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_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_C000000001300001”。不确定原因,或者这是否与我的实际问题有关。

真正的问题是,当我再添加一个连接子查询时,我得到:

ORA-00904: "N"."RACE_ID": invalid identifier

这是与额外嵌套块(在外面的那个)相同的代码

SELECT *
FROM proj_entry m   
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
) n
ON n.race_id = m.race_id WHERE n.horse_id = m.horse_id;

我觉得自己在这座山上已经过得很好,然后最后一条线路出了问题,尽管它的结构与之前的所有街区差不多。我之前在代码中也使用了race_id和horse_id,所以它们可以工作。

我也在最后一行尝试过这个:

ON n.race_id = m.race_id AND n.horse_id = m.horse_id;

以及一些其他变体,括号等......

1 个答案:

答案 0 :(得分:3)

起初我无法看到任何错误,但是后来我无法通过该语法看到任何相当不错的内容!问题可能是"N"."RACE_ID"不明确,因为"N"是连接许多表的查询的别名,可能不止一个表有RACE_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": invalid identifier的错误,您肯定会知道它引用了表proj_trainer,而之前的"N"."RACE_ID"可能是模棱两可的,因为" N"是一个加入大约六个表的查询的别名。

除了SELECT *之外,最好指定所需的实际列,这样可以避免重复 - 例如:

SELECT e.race_id, t.trainer_id, t.trainer_name, ...

(我认为以查询工具生成的' QCSJ'开头的列名称是为了应对结果中的重复列名称。什么是查询工具?)