Ошибка в запросе с соединением таблицы: 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 шт):
Проблема здесь
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) крайне неудачное. Зачем вам спец-символы в названии?
Не совсем понятно откуда взялась ошибка, т.к. другого похожего столбца нет
В том то и дело, что есть другой столбец.
Чтобы стало совсем понятно, простой пример:
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