проблема псевдонима столбца 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 строк)