проблема псевдонима столбца postgres

Как новичок в PostgreSQL (я переезжаю, потому что я двигаюсь мой сайт на Heroku, которые поддерживают только его, я рефакторинга некоторые из моих запросов и кода. Вот проблема, с которой я не могу понять проблему:

PGError: ERROR:  column "l_user_id" does not exist
LINE 1: ...t_id where l.user_id = 8 order by l2.geopoint_id, l_user_id ...
                                                             ^

...запрос:

   select distinct 
          l2.*, 
          l.user_id as l_user_id, 
          l.geopoint_id as l_geopoint_id 
     from locations l 
left join locations l2 on l.geopoint_id = l2.geopoint_id 
    where l.user_id = 8 
 order by l2.geopoint_id, l_user_id = l2.user_id desc

пункт " l.user_id как l_user_id, l.geopoint_id как l_geopoint_id " был добавлен, потому что, по-видимому, postgres не любит предложения порядка с не выбранными полями. Но ошибка теперь я понимаю, он выглядит как я также не получается сглаживание. Кто-нибудь с опытом postgres видит проблему?

у меня, вероятно, будет куча этих проблем-запросы отлично работали в mySql...

4 ответов


в PostgreSQL вы не можете использовать выражение с псевдонимом по порядку. Там работают только простые псевдонимы. Ваш запрос должен выглядеть так:

   select distinct 
          l2.*, 
          l.user_id as l_user_id, 
          l.geopoint_id as l_geopoint_id 
     from locations l 
left join locations l2 on l.geopoint_id = l2.geopoint_id 
    where l.user_id = 8 
 order by l2.geopoint_id, l.user_id = l2.user_id desc;

Я предполагаю, что вы имеете в виду, что l2.user_id=l.user_id должен идти первым.

это соответствующее сообщение на PostgreSQL-общий список рассылки. Следующее находится в документация ORDER BY п.:

каждое выражение может быть имя или порядковый номер выход колонка (выберите пункт списка), или может быть произвольные слова от ввод-колонки значения.

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


у вас есть:

order by l2.geopoint_id, l_user_id = l2.user_id desc

в запросе. Это незаконный синтаксис. Удалить = l2.user_id часть (переместите ее в where если это одно из условий соединения) и он должен работать.

обновление ниже выбрать (с = l2.user_id removed) должен работать просто отлично. Я тестировал его (с разными именами таблиц / столбцов, очевидно) на Postgres 8.3

select distinct 
       l2.*, 
       l.user_id as l_user_id, 
       l.geopoint_id as l_geopoint_id 
  from locations l 
  left join locations l2 on l.geopoint_id = l2.geopoint_id 
 where l.user_id = 8 
 order by l2.geopoint_id, l_user_id desc

я столкнулся с этой же проблемой, используя функции из основной - в частности, функция Левенштейна. Мне нужно было как Сортировать по расстоянию строки, так и фильтровать результаты по расстоянию строки. Я изначально пытался:

SELECT thing.*, 
levenshtein(thing.name, '%s') AS dist 
FROM thing 
WHERE dist < character_length(thing.name)/2 
ORDER BY dist

но, конечно, я получил ошибку "столбец " dist" не существует " из предложения WHERE. Я попробовал это, и это сработало:

SELECT thing.*, 
(levenshtein(thing.name, '%s')) AS dist 
FROM thing 
ORDER BY dist

но мне нужно было иметь эту квалификацию в предложении WHERE. Кто-то еще в этом вопросе сказал что предложение WHERE оценивается перед порядком, таким образом, столбец не существовал, когда он оценивал предложение WHERE. Следуя этому совету, я понял, что вложенный оператор SELECT делает трюк:

SELECT * FROM 
(SELECT thing.*, 
     (levenshtein(thing.name, '%s')) AS dist 
     FROM thing 
     ORDER BY dist
) items 
WHERE dist < (character_length(items.name)/2)

обратите внимание, что требуется псевдоним таблицы "элементы", а псевдоним столбца dist доступен во внешнем SELECT, потому что он уникален в инструкции. Это немного фанк, и я удивлен, что это должно быть так в PG - но это, похоже, не требует производительности ударил, чтобы я был доволен.


"был добавлен, потому что, по-видимому, postgres не любит предложения заказа с полями, не выбранными"

" Что касается order by goes-да, PostgresQL (и многие другие базы данных) не позволяет упорядочивать по столбцам, которые не перечислены в предложении select."

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

=> выберите id из заказа t1 по ограничению владельца 5;

id

30 Десять Двадцать Пятьдесят Сорок (5 строк)