Ошибка в запросе с соединением таблицы: Error: ORA-00918: столбец определен неоднозначно

Имеется код таблиц:

CREATE TABLE price (
    id                  INTEGER NOT NULL,
    num_of_z            INTEGER NOT NULL,
    ticket_price        INTEGER NOT NULL,
    discounted_tickets  INTEGER NOT NULL
);

ALTER TABLE price ADD CONSTRAINT price_pk PRIMARY KEY ( id );

ALTER TABLE price ADD CONSTRAINT price_num_of_z_un UNIQUE ( num_of_z );

CREATE TABLE schedule (
    id             INTEGER NOT NULL,
    train_num      INTEGER NOT NULL,
    route          INTEGER NOT NULL,
    train_dir      VARCHAR2(15 CHAR) NOT NULL,
    schedule_days  VARCHAR2(9 CHAR) NOT NULL,
    station_id1     INTEGER NOT NULL,
    station_id2    INTEGER NOT NULL
);

ALTER TABLE schedule ADD CONSTRAINT schedule_pk PRIMARY KEY ( id );

ALTER TABLE schedule ADD CONSTRAINT schedule_train_num_route_un UNIQUE ( train_num,
                                                                         route );

CREATE TABLE station (
    id           INTEGER NOT NULL,
    name         VARCHAR2(10 CHAR) NOT NULL,
    tariff_zone  INTEGER NOT NULL
);

ALTER TABLE station ADD CONSTRAINT station_pk PRIMARY KEY ( id );

CREATE TABLE stopover (
    id                    INTEGER NOT NULL,
    serial_num_dir        INTEGER NOT NULL,
    arrival_time          VARCHAR2(9 CHAR) NOT NULL,
    train_num             INTEGER NOT NULL,
    "station_pass_(y/n)"  VARCHAR2(1 CHAR) NOT NULL,
    station_id            INTEGER NOT NULL,
    schedule_id           INTEGER NOT NULL
);

ALTER TABLE stopover
    ADD CHECK ( "station_pass_(y/n)" IN ( 'n', 'y' ) );

ALTER TABLE stopover ADD CONSTRAINT stopover_pk PRIMARY KEY ( id );

ALTER TABLE schedule
    ADD CONSTRAINT schedule_station_fk FOREIGN KEY ( station_id1 )
        REFERENCES station ( id );

ALTER TABLE stopover
    ADD CONSTRAINT stopover_schedule_fk FOREIGN KEY ( schedule_id )
        REFERENCES schedule ( id );

ALTER TABLE stopover
    ADD CONSTRAINT stopover_station_fk FOREIGN KEY ( station_id )
        REFERENCES station ( id );

Для этой задачи:

Выберите все поезда (название станций начала и конца маршрута) на которых от станции «Царицыно» можно доехать до станции «Москва-Курская».

Пытаюсь сделать запрос:

SELECT * FROM STOPOVER STATION_ID1 JOIN STOPOVER STATION_ID2
on (STATION_ID1.schedule_id=STATION_ID2.schedule_id)
where "station_pass_(y/n)"= 'n';

И ошибка:

Error starting at line : 1 in command -
SELECT * FROM STOPOVER STATION_ID1 JOIN STOPOVER STATION_ID2
on (STATION_ID1.schedule_id=STATION_ID2.schedule_id)
where "station_pass_(y/n)"= 'n'
Error at Command Line : 3 Column : 7
Error report -
SQL Error: ORA-00918: столбец определен неоднозначно
00918. 00000 -  "column ambiguously defined"
*Cause:    
*Action:

Не совсем понятно откуда взялась ошибка, т.к. другого похожего столбца нет, и не понятно как её исправить.


Ответы (2 шт):

Автор решения: Anton Shchyrov

Проблема здесь

where "station_pass_(y/n)"= 'n';

У вас идет выборка данных из двух таблиц

  • STOPOVER STATION_ID1
  • STOPOVER STATION_ID2

То, что вы джойните одну и ту же таблицу значения не имеет. Для движка это две различных таблицы с одинаковыми полями. Из какой таблицы нужно взять поле для сравнения? Если из конкретной, то укажите ее алиас

where STATION_ID1."station_pass_(y/n)"= 'n';

Если из любой, то напишите два условия

where
  STATION_ID1."station_pass_(y/n)"= 'n' or
  STATION_ID2."station_pass_(y/n)"= 'n'

P.S. название поля station_pass_(y/n) крайне неудачное. Зачем вам спец-символы в названии?

→ Ссылка
Автор решения: 0xdb

Не совсем понятно откуда взялась ошибка, т.к. другого похожего столбца нет

В том то и дело, что есть другой столбец.

Чтобы стало совсем понятно, простой пример:

create table t (id) as select 1 from dual
/
select id
from t t1 join t t2 on t2.id = t1.id

ORA-00918: column ambiguously defined

select t1.id
from t t1 join t t2 on t2.id = t1.id

        ID
----------
         1

В первом запросе два столбца с одним и тем же именем id, в таблице t1 и t2, и не понятно - из какой таблицы брать. Это надо указать явно.

Совсем наоборот, с натуральным соединением, то есть где БД сама выбирает столбцы для соединения. БД "возмутится", если ей попробовать подсказать, из какой таблицы взять id:

select t1.id
from t t1 natural join t t2 

ORA-25155: column used in NATURAL join cannot have qualifier

select id
from t t1 natural join t t2 

        ID
----------
         1
→ Ссылка