문제

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 as l_user_id, l.geopoint_id as l_geopoint_id"가 추가되었습니다. Postgres는 필드가 선택되지 않은 순서 조항을 좋아하지 않기 때문에 "L.user_id, l.geopoint_id"조항이 추가되었습니다. 그러나 내가 지금 얻는 오류는 내가 또한 별명을 얻지 못하는 것처럼 보이게합니다. Postgres 경험이있는 사람이 문제를 본 사람이 있습니까?

이러한 문제가 많이있을 것입니다. 쿼리는 MySQL에서 잘 작동했습니다 ...

도움이 되었습니까?

해결책

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-General 메일 링리스트에서. 다음은 문서화 ORDER BY:

각 표현은 이름 또는 서수 번호 출력 열 (목록 항목 선택), 또는 임의의 표현은 형성된 표현 입력 열 가치.

따라서 표현이 사용될 때 별명이 없습니다.

다른 팁

당신은 :

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

쿼리에서. 그것은 불법 구문입니다. 제거하십시오 = l2.user_id 부품 (이동하십시오 where 그것이 조인 조건 중 하나라면) 작동해야합니다.

업데이트 아래에서 선택하십시오 ( = l2.user_id 제거)는 잘 작동해야합니다. 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

퍼지 스트 매치 (Fuzzystrmatch)의 함수, 특히 levenshtein 함수의 함수를 사용하여 동일한 문제를 겪었습니다. 문자열 거리별로 정렬하고 문자열 거리에 따라 결과를 필터링해야했습니다. 나는 원래 시도하고 있었다 :

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

그러나 물론 WHERE 절에서 "열"dist "가 존재하지 않는 오류가 발생했습니다. 나는 이것을 시도했고 그것은 효과가있다.

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

그러나 나는 Where 절에서 그 자격을 가졌다. 이 질문의 다른 누군가는 WHERE 절이 주문 전에 평가되었으므로 WHERE 절을 평가할 때 열이 존재하지 않았다고 말했습니다. 그 조언에 따라, 나는 중첩 된 선택 진술이 트릭을 수행한다는 것을 알아 냈습니다.

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

"항목"테이블 별칭이 필요하며 Dist 열 별칭은 문에서 고유하기 때문에 외부 선택에서 액세스 할 수 있습니다. 그것은 약간 펑키하고 PG에서 이런 식으로 있어야한다는 사실에 놀랐습니다. 그러나 그것은 성능을 얻지 못하는 것 같아서 만족합니다.

"Postgres는 필드가 선택되지 않은 순서 조항을 좋아하지 않기 때문에 추가되었습니다."

"GOES -DES -YES, PostgreSQL (및 기타 많은 데이터베이스)은 SELECT 절에 나열되지 않은 열별로 주문을 허용하지 않습니다."

진실이 아닌 평범한.

=> 소유자 제한 5로 T1 주문에서 ID를 선택하십시오.

ID

30 10 20 50 40 (5 행)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top