Oracle - не может использовать знак * с другим столбцом в предложении выбора - PullRequest
0 голосов
/ 04 июля 2018

Извините, если это тривиально, но выбор столбца со знаком * не всегда работает, и я не нахожу ссылку на это поведение.

Я могу выбрать таблицу A и столбец col со следующими инструкциями:

select * from A; и select col from A; и select aa.col,aa.* from A aa;

Но я не могу посмотреть это вместе:

select *,col from A;

приведет к ошибке ORA-00923: FROM keyword not found

select col,* from A aa;

приведет к ошибке ORA-00936: missing expression

Почему я должен использовать псевдоним для знака *?

select col,aa.* from A aa;

Почему ошибки так вводят в заблуждение?

Ответы [ 3 ]

0 голосов
/ 04 июля 2018

Синтаксическая диаграмма для select показывает:

enter image description here

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

На внутреннем пути, который допускает , допускается запятая и, следовательно, несколько выражений, вы можете использовать только .* с префиксом таблицы / представления / псевдонима, а затем можете следовать (или предшествовать) этому с другие выражения.

(Я действительно думал, что где-то было сказано более четко, но я не могу найти его где-нибудь в недавней документации ...)

Почему я должен использовать псевдоним для знака *?

select col,aa.* from A aa;

Это не вполне точно; вам не нужно использовать псевдоним, вы можете использовать имя таблицы напрямую, если оно не является псевдонимом, так что это также верно:

select col,A.* from A;

Существует школа мысли, что в любом случае не следует использовать подстановочный знак, по крайней мере, для чего-либо, кроме специального запроса - лучше явно перечислить все необходимые имена столбцов с префиксом, в частности, с соответствующим именем таблицы / псевдонимом если есть соединение, для ясности и во избежание непредвиденных проблем с изменяемыми таблицами. Это скорее выходит за рамки этого вопроса, хотя * 8 -)

0 голосов
/ 04 июля 2018

Почему ошибки так вводят в заблуждение?

Ошибки верны. Они просто не догадываются, что вы пытаетесь сделать. После

select *

следующее ключевое слово должно быть from, поэтому все остальное дает

FROM keyword not found where expected

После , должно быть допустимое выражение, такое как имя столбца, а не *, что является неожиданным, поэтому вы получите

ORA-00936: missing expression

Возможно, было бы неплохо, если бы Oracle написал специальное сообщение об ошибке о неправильном использовании *, но пока они этого не сделали. Вы можете предложить это на форуме Oracle Database Ideas .

0 голосов
/ 04 июля 2018

Ограничение не так четко указано в документации, но вы можете найти его, следуя этой схеме .

enter image description here

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...