2010-02-23 5 views
20

Скажем, у меня есть выбор о том, что идет ..Почему вы выбрали указанные столбцы, и все это неправильно в Oracle SQL?

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 нужен псевдоним таблицы, чтобы иметь возможность выработать выбор?

+0

Спасибо, что задали этот вопрос. Я перехожу из SQL Server в Oracle. Я вижу ту же ошибку. – user3454439

ответ

17

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

select is_parent, animals.* from animals; 

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

+0

Я бы никогда не поставил «*» в производственный код, но это работа, в которой я нуждался. Я делал «охоту» и пытался что-то вроде Select (ColA || ',' || ColB) как «CompoundPK», * из MYTABLE. Спасибо за обходное решение. Upvote. – granadaCoder

1

Случай использования для псевдонима. * Формат выглядит следующим образом

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

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

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

+1

Я знаю, что если вы используете несколько таблиц, которые вам нужно определить, для чего нужно вернуть все столбцы, но мне было интересно, почему Oracle не может решить, какую таблицу я имею в виду, когда у нее есть выбор из одной таблицы. Кроме того, я нахожу «select column, *', используемый при отладке, экономит время по сравнению с попыткой скопировать столбцы и портировать их в Excel, вручную перемещая столбцы с риском несоответствия данных. – glasnt

2

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

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

+2

'Выбрать *' в реальном мире действительно опасно. Я был догнал, когда столбцы добавлены, а '*' используется в процедурах. Однако для adhoc-запросов мое утверждение было полностью верным. – glasnt

1

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

2

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

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

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

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

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-летний старый код.

Другое для "купить почему !!!" ведро, вместе с why can't you group by an alias?

+1

Отрицательный результат немного суровый. Я думаю, что только Рене и я на сегодняшний день ответили на вопрос. Все остальные ответы просто говорят, что «select *» не следует использовать. –

2

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

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

sql>select geometrie.SDO_GTYPE from ngg_basiscomponent 

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

где Geometrie представляет собой столбец типа MDSYS.SDO_GEOMETRY.

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

sql>select a.geometrie.SDO_GTYPE from ngg_basiscomponent a; 
0

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

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

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