Ошибка "столбец неопределенно определен"

У меня есть такой запрос:

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
Другие вопросы по тегам