Как устранить ошибку SQL при извлечении данных из таблицы сторонних данных в Postgres

У меня есть таблица сторонних данных, созданная с помощью tds_fdw, которая сопоставляет представление SQL на сервере MSSQL со сторонней таблицей в Postgres. Я могу без проблем просматривать и запрашивать данные в этой таблице. Но я получаю эту ошибку, когда пытаюсь запросить эту таблицу из запроса, который присоединяется к внешней таблице и нескольким другим таблицам.

Ошибка:

[2020-07-28 14:04:25] [HV00L] ERROR: DB-Library error: DB #: 20018, DB Msg: General SQL Server error: Check messages from the SQL Server, OS #: -1, OS Msg: , Level: 15
[2020-07-28 14:04:25] [00000] DB-Library notice: Msg #: 156, Msg state: 1, Msg: Incorrect syntax near the keyword 'as'., Server: DB1DBSSVR1, Process: , Line: 1, Level: 15

Так выглядит SQL-запрос

SELECT COL1, COL2, COL3 FROM (
    SELECT a.COL1, b.COL2, c.COL3 FROM 
        PSQL_TABLE_1 a JOIN PSQL_TABLE_2 b ON a.ID = b.ID
        JOIN FOREIGN_TABLE f on b.ID = f.CODE WHERE a.COL5 = 'S'
    UNION ALL
    SELECT a.COL1, b.COL2, c.COL3 FROM 
        PSQL_TABLE_1 a JOIN PSQL_TABLE_3 b ON a.ID = b.ID
        JOIN FOREIGN_TABLE f on b.ID = f.CODE WHERE a.COL5 = 'S'
) 
DERIVED WHERE DERIVED.SEQ_NO = 'xxxx'

Примечание
Ранее в этом запросе использовалась локальная таблица pg, которая имела то же имя и структуру, что и внешняя таблица, и работала нормально. Эта проблема возникла после ее переименования и создания новой сторонней таблицы с тем же именем и структурой.


person Isuru Pathirana    schedule 28.07.2020    source источник
comment
Где выполняется этот запрос, на SQL Server или Postgres? Также в сообщении об ошибке написано: Incorrect syntax near the keyword 'as'., а в отображаемом вами запросе нет as. Это исходит из запроса просмотра? Также из какого журнала вы получаете ошибки?   -  person Adrian Klaver    schedule 28.07.2020
comment
@Adrian Query выполняется в Postgres. Ошибка связана с показанным мной запросом. Я получаю эту ошибку из журнала Postgres. Я запускаю tds_fdw с включенными сообщениями журнала   -  person Isuru Pathirana    schedule 28.07.2020
comment
Что ж, ошибка очевидна, что проблема около ключевого слова as. Я не вижу as в запросе. Так вы уверены, что не отредактировали его, когда анонимизировали запрос? Вы также проверили журнал SQL Server, как следует из сообщения?   -  person Adrian Klaver    schedule 28.07.2020
comment
См. Ответ для другого объяснения.   -  person Adrian Klaver    schedule 28.07.2020
comment
Какой инструмент вы используете для выполнения этого запроса?   -  person a_horse_with_no_name    schedule 28.07.2020
comment
@AdrianKlaver Вот что меня тоже смущает. Анонимный запрос имеет ту же структуру, что и мой исходный запрос. Ранее в этом запросе использовалась локальная таблица pg, которая имела то же имя и структуру, что и внешняя таблица, и работала нормально. Все, что я сделал, это переименовал ее и создал новую внешнюю таблицу с тем же именем и структурой. Я не могу проверить журналы SQL-сервера, так как у меня нет доступа к клиентскому серверу. Клиент предоставил только эти представления. Я пытаюсь отправить журналы по электронной почте, чтобы я мог выяснить точную причину.   -  person Isuru Pathirana    schedule 29.07.2020
comment
@a_horse_with_no_name Я использую DataGrip   -  person Isuru Pathirana    schedule 29.07.2020
comment
@ Isuru Pathirana. Совершенно уверен, что это связано с запуском tds_fdw, тем более что теперь, когда вы говорите, что запуск всего этого локально сработал. В моем комментарии ниже вы пробовали переименовать DERIVED во что-то вроде DERIVED_TABLE?   -  person Adrian Klaver    schedule 29.07.2020


Ответы (2)


Ааа, теперь я понимаю. Совершенно уверен, что это так:

DERIVED WHERE DERIVED.SEQ_NO = 'xxxx'.

DERIVED - это ключевое слово, перед которым подразумевается as. Измените этот псевдоним на другое имя или укажите его в кавычках.

person Adrian Klaver    schedule 28.07.2020
comment
Кажется, это не проблема в SQL Server: dbfiddle.uk/ - person a_horse_with_no_name; 28.07.2020
comment
Я следую совету здесь: postgresql.org/docs/12/sql- ключевые слова-appendix.html Как правило, если вы получаете ложные ошибки парсера для команд, которые содержат любое из перечисленных ключевых слов в качестве идентификатора, вы должны попытаться заключить идентификатор в кавычки, чтобы увидеть, исчезнет ли проблема. Или я меняю имя. - person Adrian Klaver; 28.07.2020
comment
Хм, похоже, это тоже не проблема для Postgres: dbfiddle.uk/ - person a_horse_with_no_name; 28.07.2020
comment
Помните, что это подается через tds_fdw. - person Adrian Klaver; 28.07.2020
comment
Да, я в курсе. Но похоже, что ни у одной из сторон нет проблем с этим. Это оставляет только tds_fdw как возможную причину, по которой к запросу добавляется дополнительный as. Но это также может быть инструмент запроса. Не был бы первым, кто пытается быть умным и добавляет что-то в запрос без ведома пользователя. - person a_horse_with_no_name; 28.07.2020
comment
Я пробовал добавить туда as. Но это не имеет значения - person Isuru Pathirana; 29.07.2020
comment
Вы пробовали переименовать DERIVED во что-то вроде DERIVED_TABLE? - person Adrian Klaver; 29.07.2020
comment
@AdrianKlaver: да, но без изменений. Но я думаю, что нашел причину. Запрос начал работать, как только я обрезал идентификатор в предложении соединения. Сообщение об ошибке исчезло, и запрос работает должным образом. Однако теперь у меня есть новая проблема. Теперь БД поднимается из-за ошибки сегментации при отправке нескольких запросов в это представление. Я добавлю это как новый вопрос - person Isuru Pathirana; 30.07.2020

Похоже, проблема была связана с некоторыми значениями данных в полях, которые я использовал для объединений. Ошибка исчезла, как только я обрезал данные. Новый запрос выглядит примерно так,

SELECT COL1, COL2, COL3 FROM (
    SELECT a.COL1, b.COL2, c.COL3 FROM 
        PSQL_TABLE_1 a JOIN PSQL_TABLE_2 b ON a.ID = b.ID
        JOIN FOREIGN_TABLE f on btrim(b.ID) = f.CODE WHERE a.COL5 = 'S'
    UNION ALL
    SELECT a.COL1, b.COL2, c.COL3 FROM 
        PSQL_TABLE_1 a JOIN PSQL_TABLE_3 b ON a.ID = b.ID
        JOIN FOREIGN_TABLE f on btrim(b.ID) = f.CODE WHERE a.COL5 = 'S'
) 
DERIVED WHERE DERIVED.SEQ_NO = 'xxxx'

Этот запрос возвращает ожидаемые значения. Но мне все еще интересно, почему он выдал ошибку о синтаксической ошибке рядом с as.

person Isuru Pathirana    schedule 30.07.2020
comment
Это просто странно. Есть ли шанс as в ID? В противном случае я не знаю, почему синтаксическая ошибка. - person Adrian Klaver; 30.07.2020
comment
Единственное, что я могу сделать, если вы еще этого не сделали, - это изменить log_statement в postgresql.conf на all и перезагрузить сервер. Затем запустите оба варианта запроса и посмотрите, что отправляется на сервер. Затем установите log_statement обратно. - person Adrian Klaver; 30.07.2020