Ключевое слово from не найдено там где оно ожидалось
Перейти к содержимому

Ключевое слово from не найдено там где оно ожидалось

  • автор:

Ключевое слово from не найдено там где оно ожидалось

Осмыслили! Идем дальше! Вернемся еще раз к типу выбора столбцов в операторе, SELECT. Иногда, когда, например вы сталкиваетесь, с незнакомой БД, вам необходимо быстро рассмотреть таблицы. В таком случае вы примените, что-то в этом духе:

SQL> COL CITY FORMAT A18 SQL> SELECT * FROM OFFICES 2/ Получаем следующее: OFFICE CITY REGION MGR TARGET SALES --------- ------------------ ------------------------------ --------- --------- --------- 22 Запиндрищинск Запад 108 300 186,042 11 Красный Мотоцикл Восток 106 575 692,637 12 Чугуевск Восток 104 800 735,044 13 Бубурино Восток 105 350 367,911 21 Котрогайка Запад 108 725 835,915

Здесь ‘*‘ значит «выдать все строки»! Запросы такого типа применяются не часто, в основном как, я говорил выше, либо при получении отчетов. В некоторых БД, даже допускается такое:

SQL> SELECT *, (SALES-TARGET) FROM OFFICES 2/

Но, у меня БД ответила так:

SELECT *, (SALES-TARGET) FROM OFFICES * ошибка в строке 1: ORA-00923: ключевое слово FROM не найдено там, где оно ожидалось

Чего собственно и следовало ожидать! Да и сам запрос как-то малопонятен. Еще могу добавить, что оператор ‘*‘ так же применяется и в других случаях, например, по стандарту, по моему SQL91, как шаблон условия LIKE, но в Oracle такого, я не наблюдал! Так что, функция только одна, выдать все записи из заданной таблицы! Так же как правило, при выборе записей, часто используют уникальный ключ, для того, чтобы каждая запись была уникальна! Что это такое, расскажу, когда коснемся темы минимизации таблиц. Но иногда, возникает такая ситуация, что при выборе данных, появляются повторяющиеся значения.

Например: Вывести список идентификаторов менеджеров офисов.

SQL> SELECT MGR FROM OFFICES 2 / MGR --------- 108 106 104 105 108

Запись с номером 108 повторилась дважды! Так как Игорь Петров, из таблицы SALESREPS является менеджером по нашей легенде, сразу двух офисов. По этому запись и повторяется. Чтобы этого не происходило, нужно использовать оператор DISTINCT. Например, вот так:

SQL> SELECT DISTINCT MGR FROM OFFICES 2/ MGR --------- 104 105 106 108

Теперь результат, правильный, все ясно и понятно. Сразу предупреждаю, что DISTINCT является не производительным, оператором, по этому злоупотреблять им, особенно на больших, таблицах не рекомендую! Пока с этим все! Дальше пойдет, довольно, объемный для изложения материал, так что собиритесь, с мыслями!

Программирование Oracle

При использовании запросов в духе
select ‘Компания ‘Клаус» from dual
мы получим ошибку:
ORA-00923: ключевое слово FROM не найдено там, где оно ожидалось
Это вполне логично, текст представляется командному процессору в виде двух строк типа VARCHAR2: строки ‘Компания ‘ и пустой строки ». При этом слово Клаус командный процессор воспримет как команду, а не как текст, что и приведет к ошибке.
Для избежания подобных ошибок спецсимволы необходимо экранировать, чтобы командный процессор воспринимал их как текст.
для экранирования используем q .
select q'(Компания ‘Клаус’)’ from dual

При экранировании конкретно одинарных кавычек еще можно использовать две одинарных кавычки подряд:
select ‘Компания »Клаус»’ from dual

Результирующий текст в обоих случаях будет Компания ‘Клаус’

Как объединить несколько сложных запросов?

62e8f759bbbe8375478707.jpeg

Есть еще один запрос в который нужно вставлять данные с предыдущего селекта. В условии where где pa.r_pers_account_id нужно вставлять id с предыдущей таблицы. И в to_date(’31-01-2018′, ‘dd-mm-yyyy’) только дата должна быть как конец месяца. (Получается если дата из предыдущей таблицы 12.01.2018 то должно вставляться 31.01.2018) так же данные по дате с предыдущей таблицы. (В моем случае вставил вручную только одни данные)

Второй запрос

select TP.IIN_BIN, pa.r_pers_account_id, pa.close_date, kbk.kbk_code, org.code_nk, org.CODE_TPK, op.m_operation_type_id, pa.open_date, sum(op.amount) from r_pers_account pa join r_tax_payer tp on pa.r_tax_payer_id = tp.r_tax_payer_id join r_pers_acc_operation op on op.r_pers_account_id = pa.r_pers_account_id join m_kbk kbk on kbk.m_kbk_id = pa.m_kbk_id join m_tax_org org on org.m_tax_org_id = pa.m_tax_org_id where pa.r_pers_account_id in (16616864) and is_charge_fine = 0 and trunc(op.actual_date, 'fmdd') 

62e8f9f1aec16162111910.jpeg

В этом селекте тоже самое нужно вставлять данные по id и дате.

Третий запрос

select TP.IIN_BIN, pa.r_pers_account_id, pa.close_date, kbk.kbk_code, org.code_nk, org.CODE_TPK, op.m_operation_type_id, pa.open_date, sum(op.amount) from r_pers_account pa join r_tax_payer tp on pa.r_tax_payer_id = tp.r_tax_payer_id join r_pers_acc_operation op on op.r_pers_account_id = pa.r_pers_account_id join m_kbk kbk on kbk.m_kbk_id = pa.m_kbk_id join m_tax_org org on org.m_tax_org_id = pa.m_tax_org_id where pa.r_pers_account_id in (16616864) and is_charge_fine = 0 and trunc(op.actual_date, 'fmdd') 

62e8fb79b595e177892025.jpeg

Нужно сделать так чтобы эти 3 запроса были одним select-ом.

К дополнению, после объединении этих запросов, нужно выводить данные по условию если у второго селекта столбец sum(op.amount) имеет отрицательное число, а у третьего селекта столбец sum(op.amount) имеет 0 или положительное число.

  • Вопрос задан более года назад
  • 149 просмотров

7 комментариев

Простой 7 комментариев

iMedved2009

Дмитрий @iMedved2009
2 и 3 запрос одинаковые?

Smithson

alexalexes @alexalexes
with для одинаковых фрагментов подзапросов ?
Amir Kenesbay @Amir1807 Автор вопроса
Дмитрий, На втором запросе op.m_operation_type_id = 1, а на третьем op.m_operation_type_id = 2
Amir Kenesbay @Amir1807 Автор вопроса
alexalexes, Если через with то какова реализация? Можно пожалуйста по подробнее
mayton2019 @mayton2019

Объединить результаты, или сделать соединение?

Задание конечно ужас-ужас.

Amir Kenesbay @Amir1807 Автор вопроса
mayton2019, сделать соединение
Решения вопроса 0
Ответы на вопрос 2

iMedved2009

Дмитрий @iMedved2009
Не люблю людей
Для PostgresSQL
То ли я чего то не понимаю в задаче, то ли как то так

select TP.IIN_BIN, pa.r_pers_account_id, pa.close_date, kbk.kbk_code, org.code_nk, org.CODE_TPK, op.m_operation_type_id, pa.open_date, sum(op.amount) from r_pers_account pa join (Select rpao.r_pers_account_id, max(rbs.create_date) as date from r_base_trans rbs join r_pers_acc_operation rpao on rbs.r_base_trans_id = rpao.r_base_trans_id where rbs.create_date between to_date('01.12.2017', 'dd.mm.yyyy') and to_date('31.12.2020', 'dd.mm.yyyy') and rbs.M_BASE_TRANS_TYPE_ID NOT IN 26 and ROWNUM < 100 group by rpao.r_pers_account_id) as nested_table on nested_table.r_pers_account_id = pa.r_pers_account_id and nested_table.date >= trunc(op.actual_date, 'fmdd') join r_tax_payer tp on pa.r_tax_payer_id = tp.r_tax_payer_id join r_pers_acc_operation op on op.r_pers_account_id = pa.r_pers_account_id join m_kbk kbk on kbk.m_kbk_id = pa.m_kbk_id join m_tax_org org on org.m_tax_org_id = pa.m_tax_org_id where is_charge_fine = 0 and op.m_operation_type_id in (1, 2) group by tp.IIN_BIN, pa.r_pers_account_id, pa.close_date, kbk.kbk_code, op.m_operation_type_id, org.code_nk, org.code_tpk, pa.open_date;

можно конечно через cte

with nested_table as ( Select rpao.r_pers_account_id, max(rbs.create_date) as date from r_base_trans rbs join r_pers_acc_operation rpao on rbs.r_base_trans_id = rpao.r_base_trans_id where rbs.create_date between to_date('01.12.2017', 'dd.mm.yyyy') and to_date('31.12.2020', 'dd.mm.yyyy') and rbs.M_BASE_TRANS_TYPE_ID NOT IN 26 and ROWNUM < 100 group by rpao.r_pers_account_id ) select TP.IIN_BIN, pa.r_pers_account_id, pa.close_date, kbk.kbk_code, org.code_nk, org.CODE_TPK, op.m_operation_type_id, pa.open_date, sum(op.amount) from r_pers_account pa join nested_table on nested_table.r_pers_account_id = pa.r_pers_account_id and nested_table.date >= trunc(op.actual_date, 'fmdd') join r_tax_payer tp on pa.r_tax_payer_id = tp.r_tax_payer_id join r_pers_acc_operation op on op.r_pers_account_id = pa.r_pers_account_id join m_kbk kbk on kbk.m_kbk_id = pa.m_kbk_id join m_tax_org org on org.m_tax_org_id = pa.m_tax_org_id where is_charge_fine = 0 and op.m_operation_type_id in (1, 2) group by tp.IIN_BIN, pa.r_pers_account_id, pa.close_date, kbk.kbk_code, op.m_operation_type_id, org.code_nk, org.code_tpk, pa.open_date;

Ora 00923 ключевое слово from не найдено там где оно ожидалось

PL/SQL developers who run sql queries on Oracle database may experience the «ORA-00923: FROM keyword not found where expected» error. Although the ORA-00923 error is self describing the Oracle exception, it may be difficult especially for Transact-SQL (T-SQL) developers to solve ORA-00923 error.

For example, if you run following PL/SQL statement to display SysDate variable :

Oracle database developers will experience the error message :
ORA-00923: FROM keyword not found where expected

ora-00923-from-keyword-not-found-where-expected

But if the sql developer has experience on SQL Server T-SQL programming, he will execute following SQL Select statement successfully.

The difference between T-SQL and PL/SQL is PL/SQL developers have to use DUAL dummy table which has single row single column data which is build for such tasks. If as a developer, you place Dual table name after FROM clause in your PL/SQL Select statement, the query will run successfully.

The correct sql code for PL/SQL developers to use will be as follows:
PL/SQL developers should use Oracle Dual table in order to select system variable or to select data except from Oracle database table.

This is one of the first hints for SQL developers who are new to PL/SQL but have experience on T-SQL programming.
In order to avoid ORA-00923: FROM keyword not found where expected error message, PL/SQL developers can Select system variables, or Select data that does not require an Oracle table FROM Dual table.

Ora 00923 ключевое слово from не найдено там где оно ожидалось

oracle tutorial webinars

ORA-00923 is a commonly seen error that is easily resolved by simply correcting its syntax. Keep in mind ORA-00923 does not occur in Oracle 10g.

The Problem

When you are faced with this error, you will see the following message:

ORA-00923 FROM keyword not found where expected

ORA-00923 occurs when you try to execute a SELECT or REVOKE statement without a FROM keyword in its correct form and place. If you are seeing this error, the keyword FROM is spelled incorrectly, misplaced, or altogether missing. In Oracle, the keyword FROM must follow the last selected item in a SELECT statement or in the case of a REVOKE statement, the privileges. If the FROM keyword is missing or otherwise incorrect, you will see ORA-00923.

The Solution

To resolve ORA-00923, the user should make sure three possible causes are corrected. First, the user must correct the syntax. Make sure you have placed the keyword FROM in its correct place, and that no spelling errors have occurred. Secondly, if you used quotation marks in an alias, make sure that they have properly enclosed the alias and that they are double quotation marks. Lastly, make sure no reserved words were used as an alias. See the Oracle appendix for reserved words to view a complete list. For practical application of these practices on how to resolve ORA-00923, see the following examples.

In the following example, the query is missing the keyword FROM:

To correct the statement, insert the FROM keyword in the correct place, and run again:

Another example of the ORA-00923 error is when quotation marks do not properly enclose the alias, as in the following:

SELECT manager AS manager column

The alias—in this example, manager column—is not enclosed in double quotation marks. Resolve ORA-00923 by fixing this syntax mistake.

SELECT manager AS “manager column”

Looking Forward

Avoiding ORA-00923 in the future is a matter of keeping to the proper syntax when executing SELECT or REVOKE statements. While correcting this error is not difficult, simply remember the following rules to avoid seeing this error.

  1. The FROM keyword should follow the last selected item. Make sure it is not misspelled, misplaced, or missing.
  2. Make sure you have enclosed the alias in double quotation marks.
  3. Make sure no Oracle reserved word was used as an alias.

If you continue to experience this error, you may consider contacting your database administrator or a licensed Oracle consultant. Always check your consultant’s credentials and experience to ensure they meet your needs.

Oracle / PLSQL: ORA-00923 Error Message

Learn the cause and how to resolve the ORA-00923 error message in Oracle.

Description

When you encounter an ORA-00923 error, the following error message will appear:

  • ORA-00923: FROM keyword not found where expected

Cause

You tried to execute a SELECT statement, and you either missed or misplaced the FROM keyword.

Resolution

The option(s) to resolve this Oracle error are:

Option #1

This error can occur when executing a SELECT statement that is missing the FROM keyword.

For example, if you tried to execute the following SELECT statement:

You could correct this SELECT statement by including the FROM keyword as follows:

Option #2

This error can also occur if you use an alias, but do not include the alias in double quotation marks.

For example, if you tried to execute the following SQL statement:

You could correct this SELECT statement by using double quotation marks around the alias:

Option #3

This error can also occur if you add a calculated column to a SELECT * statement.

For example, if you tried to execute the following SQL statement:

You could correct this SELECT statement by including the table name qualifier in front of the wildcard:

Option #4

You can also generate this error by having an unbalanced set of parenthesis.

For example, if you tried to execute the following SQL statement:

You could correct this SELECT statement by removing the extra closing parenthesis just prior to the alias:

Почему я получаю сообщение «ORA-00923: ключевое слово FROM не найдено там, где ожидалось»?

Мне пришлось заменить двойные кавычки на одинарные в запросе, чтобы получить строку запроса для компиляции в среде IDE при переносе с Delphi на C#.

IOW с таким SQL, который работает в Delphi и Toad:

. Мне пришлось изменить его на это, чтобы он скомпилировался в Visual Studio:

Однако SQL не будет работать таким образом — я получаю сообщение об ошибке «ORA-00923: ключевое слово FROM не найдено там, где ожидалось» (как в Toad, так и при попытке выполнить SQL в приложении C#).

Как я могу заставить его скомпилировать и запустить?

B. Clay Shannon-B. Crow Raven

мы можем увидеть строку с размещением «от»? — KevinDTimm

Я могу избежать проблемы, удалив псевдонимы столбцов, которые в данном случае мне не нужны, но что, если я это сделаю/когда это сделает кто-то другой? — B. Clay Shannon-B. Crow Raven

@Кевин: . . . W.INTERLOPERTYPE, W.OFFICEDIVISION FROM RTINTERLOPERSTAT R, ABCWORKER W — B. Clay Shannon-B. Crow Raven

Что это @» префикс? Это точно недопустимый SQL. — a_horse_with_no_name

Нет, это для C#, чтобы я мог распределить строки SQL по нескольким строкам в редакторе, не работая над конкатенацией строк. IOW, то, что я только что написал (выше), вызовет ошибку компиляции, если я добавлю его к: String s = «, но если добавить его к String s = @», все будет в порядке. — B. Clay Shannon-B. Crow Raven

2 ответы

Кавычки вокруг псевдонимов вашей колонки вызывают изжогу.

Похоже, что в исходном случае весь запрос заключен в двойные кавычки, а двойные кавычки вокруг псевдонимов столбцов мешают им.

Во втором случае Oracle интерпретирует псевдонимы столбцов в одинарных кавычках как строки, что его искажает.

В Oracle вам тоже не нужно: вы должны иметь возможность просто кодировать:

или, используя необязательный AS ключевое слово:

Надеюсь это поможет.

ответ дан 19 апр.

Обычно это не работает, если у вас есть встроенные комментарии в запросе.

Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками sql oracle ora-00923 or задайте свой вопрос.

Похожие публикации:

  1. Как преобразовать nrg в iso образ
  2. Как найти число в массиве питон
  3. Как разделить массив на символы
  4. Как скинуть настройки яндекс станции мини

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *