12
votes

Problème d'alias de colonne Postgres

comme un débutant à PostgreSQL (je me déplace parce que je bouge mon site à Heroku qui ne l'appelle que, je dois refacturer certaines de mes questions et codes. Voici un problème que je ne peux pas tout à fait Comprenez le problème avec: xxx

... requête: xxx

clause "l.user_id comme l_user_id, l.geopoint_id comme l_geopoint_id" a été ajouté parce que apparemment Postgres n'aime pas les clauses de commande avec des champs non sélectionnés. Mais l'erreur que je commence à faire semble que je ne fais pas d'aliasing. Quelqu'un avec Postgres Expérience Voir le problème?

i 'M susceptible d'avoir un tas de ces problèmes - les requêtes fonctionnaient bien dans MySQL ...


1 commentaires

Plus il est facile de lire, plus il est facile pour nous de vous aider ...


4 Réponses :


4
votes

Vous avez: xxx pré>

dans votre requête. C'est la syntaxe illégale. Supprimer le = l2.user_id code> la pièce (déplacez-le sur où code> si c'est l'une des conditions de jointure) et devrait fonctionner. P>

Mise à jour strong> ci-dessous SELECT (avec = l2.user_id code> supprimé) devrait fonctionner simplement bien. Je l'ai testé (avec des noms de table / colonne différents, évidemment) sur Postgres 8.3 P>

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


2 commentaires

J'ai changé les références aux non-aliasées, et tout va bien. Les modifications apportées à ce que vous suggérez n'ont pas changé le problème de l'alias, cependant: cela n'aimait toujours pas l'alias L_USER_ID ...


Ce n'est pas l'équivalent de la requête en question. "Commander par l_user_id = l2.user_id desc" signifie que les lignes où l.user_id et l2.user_id sont égales sont égales à aller d'abord.



1
votes

"a été ajouté car apparemment postgres n'aime pas les clauses de commande avec des champs non sélectionnés"

"En ce qui concerne la commande par Gos - Oui, PostgreSQL (et de nombreuses autres bases de données) ne permettent pas la commande par colonnes qui ne figurent pas dans la clause Select."

juste faux faux.

=> Sélectionnez ID de la commande T1 par la limite de propriétaire 5;

ID

30 dix 20 50 40 (5 rangées)


0 commentaires

16
votes

Dans PostgreSQL, vous ne pouvez pas utiliser l'expression avec un alias en ordre par. Seuls les alias ordinaires y travaillent. Votre requête devrait ressembler à ceci: xxx

Je suppose que vous voulez dire que l2.user_id = l.user_id devrait aller d'abord.

< Un href = "http://archives.postgresql.org/pgsql-general/2005-10/msg00208.php" rel = "noreferrer"> C'est un message pertinent sur la liste de diffusion PostgreSQL-Général. Ce qui suit est dans le Documentation de Commander par < / Code> Clause :

Chaque expression peut être le nom ou Nombre ordinal d'une sortie colonne (sélectionnez l'élément de liste), ou peut être une expression arbitraire formée de colonne d'entrée valeurs .

donc aucun alias quand l'expression utilisée.


1 commentaires

OK - cela a du sens, à la lumière de la règle, mais pas entièrement intuitif pour quelqu'un qui utilise MySQL depuis des années. Je vais l'essayer dans le code ...



5
votes

J'ai couru dans ce même problème à l'aide de FUZZYSTRMATCH - en particulier la fonction Levenshtein. J'avais besoin de trier à la fois de la distance de cordes et de filtrer les résultats par la distance de cordes. J'essayais à l'origine:

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


3 commentaires

Notez qu'il n'y a pas garantie qu'une ordonnance par clause de la sous-requête entraînera le résultat final d'être dans cet ordre, bien que cette requête ne soit pas au courant des optimisations qui auraient autrement. Cela serait plus sûr, cependant, de déplacer la commande par clause de la sous-requête où il affecte explicitement le résultat final.


@kgrittn. Merci pour le pointeur, mais lorsque vous avez travaillé pour moi en donnant la commande par clause à l'intérieur de la sous-requête. Les pls fournissent des informations si des scénarios spécifiques.


@ kartik-narayana-maringanti, il fonctionnera probablement comme prévu à chaque fois maintenant - la question est de savoir si vous souhaitez le laisser dans un état où une nouvelle version pourrait briser la commande ou l'écrire dans le formulaire garanti de travailler à la fois et dans les versions futures. Si vous acceptez de compter sur des détails sur la mise en œuvre non documentés plutôt que sur l'approche documentée, vous allez bien.