Как мне изменить запрос SQL для PostgreSQL? - PullRequest
2 голосов
/ 22 октября 2008

У меня есть SQL-запрос, который хорошо работает на Oracle и MSSQL. Сейчас я пытаюсь это сделать на PostgreSQL, и это выдает странное исключение: org.postgresql.util.PSQLException: ERROR: missing FROM-clause entry for table "main"

Вот запрос:

SELECT *
FROM "main" main
     INNER JOIN "something_link" something_link ON main."id" = something_link."mainid"
     INNER JOIN "something" somehting ON something_link."somethingid" = something."id"
     INNER JOIN "type" type ON something."typeid" = type."id"

Это довольно простой запрос, и я не понимаю, почему он не работает в Windows XP SP2, PostgreSQL 8.3?

Ответы [ 3 ]

4 голосов
/ 23 октября 2008

Реальная проблема на самом деле не в запросе, а в конфигурации PostgreSQL 8.3 по умолчанию. После исправления орфографической ошибки (10 раз Кендрик Уилсон) проблема сохранялась, пока я не отредактировал файл «postgresql.conf». Там должна быть строка:

add_missing_from = on

Эта строка обеспечивает совместимость с другими диалектами SQL.

4 голосов
/ 22 октября 2008

somehting => что-то


postgres=# create database test
postgres-# ;
CREATE DATABASE

postgres=# \c test
You are now connected to database "test".

test=# select version();
                                            version                                            
-----------------------------------------------------------------------------------------------
 PostgreSQL 8.3.3 on i486-pc-linux-gnu, compiled by GCC cc (GCC) 4.2.3 (Ubuntu 4.2.3-2ubuntu7)

test=# create table main(id int);
CREATE TABLE

test=# create table something_link(mainid int);
CREATE TABLE

test=# create table something(id int);
CREATE TABLE

test=# create table type(id int);
CREATE TABLE

test=# alter table something add column typeid int;
ALTER TABLE

test=# SELECT *
test-# FROM "main" main
test-#      INNER JOIN "something_link" something_link ON main."id" = something_link."mainid"
test-#      INNER JOIN "something" somehting ON something_link."somethingid" = something."id"
test-#      INNER JOIN "type" type ON something."typeid" = type."id"
test-# ;
ERROR:  column something_link.somethingid does not exist
LINE 4:      INNER JOIN "something" somehting ON something_link."som...
                                                 ^
test=# alter table something_link add column somethingid int;
ALTER TABLE

test=# SELECT *                                              
FROM "main" main
     INNER JOIN "something_link" something_link ON main."id" = something_link."mainid"
     INNER JOIN "something" *somehting* ON something_link."somethingid" = something."id"
     INNER JOIN "type" type ON something."typeid" = type."id"
;

ERROR:  invalid reference to FROM-clause entry for table "something"
LINE 4: ...hing" somehting ON something_link."somethingid" = something....
                                                             ^
HINT:  Perhaps you meant to reference the table alias "somehting".

test=# SELECT *
FROM "main" main
     INNER JOIN "something_link" something_link ON main."id" = something_link."mainid"
     INNER JOIN "something" something ON something_link."somethingid" = something."id"
     INNER JOIN "type" type ON something."typeid" = type."id"
;

 id | mainid | somethingid | id | typeid | id 

----+--------+-------------+----+--------+----

(0 rows)
2 голосов
/ 22 октября 2008

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

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