Почему неправильный выбор указанных столбцов и всего этого в Oracle SQL? - PullRequest
22 голосов
/ 23 февраля 2010

Скажем, у меня есть оператор выбора, который идет ..

select * from animals

Это дает результат запроса всех столбцов в таблице.

Теперь, если 42-й столбец таблицы animals равен is_parent, и я хочу вернуть это в своих результатах сразу после gender, чтобы мне было легче его увидеть. Но я также хочу все остальные столбцы.

select is_parent, * from animals

Возвращает ORA-00936: missing expression.

Тот же оператор будет хорошо работать в Sybase, и я знаю, что вам нужно добавить псевдоним таблицы в таблицу animals, чтобы заставить его работать (select is_parent, a.* from animals ani), но почему должен Oracle нужен псевдоним таблицы, чтобы иметь возможность выбирать?

Ответы [ 7 ]

22 голосов
/ 23 февраля 2010

На самом деле, легко решить исходную проблему. Вы просто должны квалифицировать *.

select is_parent, animals.* from animals;

должно работать просто отлично. Псевдонимы для имен таблиц также работают.

2 голосов
/ 23 февраля 2010

Хороший вопрос, я часто задавался этим вопросом сам, но потом принял это как одну из тех вещей ...

Аналогичная проблема заключается в следующем:

sql>select geometrie.SDO_GTYPE from ngg_basiscomponent

ORA-00904: "GEOMETRIE"."SDO_GTYPE": invalid identifier

где geometryrie - это столбец типа mdsys.sdo_geometry.

Добавьте псевдоним, и все работает.

sql>select a.geometrie.SDO_GTYPE from ngg_basiscomponent a;
2 голосов
/ 23 февраля 2010

Много хороших ответов о том, почему select * не следует использовать, и все они совершенно правильны. Однако не думайте, что кто-либо из них ответит на первоначальный вопрос о том, почему конкретный синтаксис не работает.

К сожалению, я думаю, что причина в том ... "потому что это не так".

Я не думаю, что это как-то связано с запросами с одной или несколькими таблицами:

Это отлично работает:

select *
from
    person p inner join user u on u.person_id = p.person_id

Но это не удалось:

select p.person_id, *
from
    person p inner join user u on u.person_id = p.person_id

Пока это работает:

select p.person_id, p.*, u.*
from
    person p inner join user u on u.person_id = p.person_id

Это может быть историческая совместимость с 20-летним устаревшим кодом.

Еще один вариант "зачем покупать !!!" ведро вместе с почему вы не можете группировать по псевдониму ?

2 голосов
/ 23 февраля 2010

Нет смысла делать это в рабочем коде. Мы должны явно назвать нужные столбцы, а не использовать конструкцию SELECT *.

Что касается специальных запросов, приобретите IDE - SQL Developer, TOAD, PL / SQL Developer и т. Д. - который позволяет нам манипулировать запросами и результирующими наборами без необходимости расширять SQL.

1 голос
/ 06 апреля 2016

почему должен Oracle иметь псевдоним таблицы, чтобы можно было работать с выбором

Терадата требует того же. Так как оба довольно старые (возможно, лучше назвать это зрелые :-) СУБД, это может быть историческими причинами.

Мое обычное объяснение таково: неквалифицированный * означает все / все столбцы , а анализатор / оптимизатор просто сбит с толку, потому что вы запрашиваете больше, чем все .

1 голос
/ 23 февраля 2010

Select * в реальном мире опасно только при обращении к столбцам по номеру индекса после извлечения, а не по имени, большая проблема заключается в неэффективности, когда не все столбцы требуются в наборе результатов (сетевой трафик, загрузка процессора и памяти) , Конечно, если вы добавляете столбцы из других таблиц (как в случае с этим примером, это может быть опасно, так как в этих таблицах со временем могут появиться столбцы с совпадающими именами, select *, x в этом случае потерпит неудачу, если столбец x добавлен стол, в котором раньше его не было.

1 голос
/ 23 февраля 2010

Вариант использования для псевдонима. * Следующий формат

select parent.*, child.col
from parent join child on parent.parent_id = child.parent_id

То есть, выбирая все столбцы из одной таблицы в объединении, плюс (необязательно) один или несколько столбцов из других таблиц.

Тот факт, что вы можете использовать его для выбора одного и того же столбца дважды, является лишь побочным эффектом. Нет смысла выбирать один и тот же столбец дважды, и я не думаю, что лень - это настоящее оправдание.

...