Ошибка "столбец неопределенно определен"
У меня есть такой запрос:
SELECT *
FROM table1 ref1,
table1 ref2,
table2 ref3,
table2 ref4,
table3
WHERE ref3.a = ref1.b ,
ref4.a = ref2.b ,
ref3.c = f,
ref4.c = d
и он прекрасно работает, он дает мне 1 запись со всеми столбцами, которые я хочу.
Два из этих столбцов имеют одинаковое имя, но последний интуитивно получает расширение _1, поэтому первый столбец с таким именем имеет имя frubberducks
а второй имеет имя frubberducks_1
и это здорово. Мне нужен запрос, который дает мне только эти два столбца, поэтому я попытался:
SELECT frubberducks
FROM table1 ref1,
table1 ref2,
table2 ref3,
table2 ref4,
table3
WHERE ref3.a = ref1.b ,
ref4.a = ref2.b ,
ref3.c = f ,
ref4.c = d
и я получаю ошибку:
ORA-00918: столбец определен неоднозначно
Каков наилучший способ сделать это?
3 ответа
Лучший способ сделать это - использовать псевдонимы таблиц и псевдонимов столбцов, как показано ниже.
для одного столбца:
SELECT ref1.frubberducks
FROM table1 ref1,table1 ref2,table2 ref3,table2 ref4,table3
WHERE ref3.a = ref1.b and ref4.a = ref2.b and ref3.c=f and ref4.c=d
для двух столбцов с одинаковым именем:
SELECT ref1.frubberducks,
ref2.frubberducks
FROM table1 ref1,table1 ref2,table2 ref3,table2 ref4,table3
WHERE ref3.a = ref1.b and ref4.a = ref2.b and ref3.c=f and ref4.c=d
для двух столбцов с одинаковым именем и псевдонимами столбцов:
SELECT ref1.frubberducks ref1frubberducks,
ref2.frubberducks ref2frubberducks
FROM table1 ref1,table1 ref2,table2 ref3,table2 ref4,table3
WHERE ref3.a = ref1.b and ref4.a = ref2.b and ref3.c=f and ref4.c=d
Лучший способ - это явно указать, например:
SELECT ref1.frubberducks as frubberducks,
ref3.frubberducks as frubberducks_1 ...
select *
означает, что вы хотите все, и вы не слишком обеспокоены тем, где оно находится в наборе результатов. Если бы вы заботились, вы бы явно перечислили столбцы. Есть несколько драгоценных случаев, когда вы должны использовать select *
тем не мение.
Это потому, что если вы указываете, какой столбец вы хотите получить взамен, вы должны указать их однозначно.
Так должно выглядеть
SELECT ref1.frubberducks, ref2.frubberducks as frubberducks_1
FROM table1 ref1,table1 ref2,table2 ref3,table2 ref4,table3
WHERE ref3.a = ref1.b , ref4.a = ref2.b , ref3.c=f , ref4.c=d