Vous n'êtes pas identifié(e).

#1 Re : Général » Requête au résultat partiellement correct » 23/07/2020 13:45:41

Merci Gleu smile J'ai bien compris le principe du LEFT JOIN et je veux justement obtenir toutes les lignes de TABLE1 et uniquement les correspondances de TABLE2.
Par contre, l'individu 3 devrait avoir les 4 mêmes correspondances que les ont l'individu 1 et 2 dans le résultat car les ADRESSES sont identiques (pas d'espace en plus, etc. J'ai bien vérifié). Pourquoi ?
Est-ce qu'en regardant le plan de requête ou les autres processus mis en oeuvre lors du traitement d'une requête, je pourrai avoir des éléments d'explications ? Je ne sais pas comment on a accès au plan de requête et les autres processus, j'essaie de comprendre comment faire.

Pourquoi un JOIN ?
Merci smile

#2 Général » Requête au résultat partiellement correct » 23/07/2020 12:39:42

databaser
Réponses : 3

Bonjour,

Voici ma démarche :

Les données : dans TABLE1, 3 individus ont la même adresse.
Dans Table 2, l'adresse apparaît 4 fois dont 1 ligne est due à la variable pour les BIS et à une VARIABLE3, 1 ligne due à la variable BIS et une VARIABLE4, 1 ligne   à une VARIABLE5.

Je veux récupérer les lignes de TABLE2 qui correspondent à l'ADRESSE de TABLE1 :

SELECT e.*, to_char(b.NUMERO '9999'), b.*
FROM MABASE.TABLE1 e LEFT OUTER JOIN MABASE.TABLE2 b ON ADRESSE = (b.NUMERO || ' ' || b.NOMVOIE) AND (e.TABLE1CP = trim(to_char(b.TABLE2CP, '99999')))
WHERE e.ADRESSE LIKE '%NOMEXEMPLE%';

Le résultat : 9 lignes : 4 lignes de TABLE2 pour 1 individu de TABLE1, 4 lignes pour le 2nd individu   == résultat correct mais : 1 seule ligne pour le 3ème individu et les colonnes de TABL2 sont vides!! Pourquoi ?!
Les variables de la jointure du code ci-dessus sont identiques pour les 3 individus de TABLE1, j'ai bien vérifié.
Si vous avez des pistes, merci! smile

#3 Re : Général » Requête avec deux conditions » 06/07/2020 16:14:42

rjuju a écrit :

Pourquoi ne pas utiliser quelquechose comme "update matable set variable2 = case when... end where ..." ?

Merci @rjuju mais êtes-vous sûr que c'est ça ? A quoi sert WHERE alors que la condition est contenue dans WHEN ? Merci smile

J'ai appliqué votre proposition sans mettre WHERE et les cellules de Variable2 ont comme valeur "true" et non la valeur attendue (ABCD ou ABC)...
Finalement, en mettant cette version, les nouvelles valeurs de Variable2 sont correctes :

UPDATE MaTable SET Variable2 = 
	CASE WHEN Variable1 = 'ABC' THEN  'ABCD'
                 WHEN Variable1 = 'ABCD' THEN  'ABC'
		 ELSE  NULL			
	END;

Merci

#4 Re : Général » Requête avec deux conditions » 06/07/2020 12:29:58

C'est pour éviter d'utiliser deux requêtes distinctes, être un peu plus efficace.
De plus, comme c'est un test, je n'ai pas mis le UPDATE mais l'objectif est de modifier la colonne Variable 2.

UPDATE MaTable SET Variable2 = 'ABCD' WHERE Variable1 = 'ABC';

Utiliser deux conditions dans un WHERE, ça je sais mais le point complexe c'est de modifier la variable2 en fonction du critère de la variable1, c'est-à-dire que Variable1 = ABC, Variable2 devient ABCD, et si Variable 1 = ABCD, Variable2 doit devenir ABC. Merci smile

#5 Général » Requête avec deux conditions » 06/07/2020 10:28:20

databaser
Réponses : 6

Bonjour,

J'aimerais remplir une colonne en fonction d'une autre colonne. Il y a deux conditions à intégrer donc je ne peux pas utiliser un WHERE.
Je tente le CASE WHEN mais la variable utilisée pour la condition et la variable pour le résultat sont deux variables différentes. Mon code ne marche pas.

1/ Sauriez-vous quelle instruction utiliser ? Le Case est peut-être inadéquat. Je n'ai rien trouvé dans le tuto de PGS.
2/ Pourquoi mon code ne donne-t-il pas le résultat escompté ?

SELECT Variable1, Variable2
FROM MaTable
WHERE
    (
	CASE WHEN Variable 1 = 'ABC' THEN Variable 2 = 'ABCD'
                 WHEN Variable 1 = 'ABCD' THEN Variable 2 = 'ABC'
                 ELSE NULL			
    END );

Merci big_smile

#6 Re : pgAdmin4 » Fonction to_char ne convertit pas integer en caractères » 11/05/2020 18:28:37

Bonjour,

Merci, voici les éléments demandés :
Mon objectif : jointure entre TABLE1 et TABLE2. Left outer join est bon, c'est le to_char qui coince.

SELECT t1.ADRESSE, t1.CPA,  t2.NOMVOIE, to_char(t2.NUMERO, '999'), to_char(t2.CPB, '99999')
FROM BASE.TABLE1 t1 LEFT OUTER JOIN BASE.TABLE2 t2 ON t1.ADRESSE = (t2.NUMERO || ' ' || t2.NOMVOIE) AND t1.CPA =  to_char(t2.CPB, '99999')
ORDER BY f.ADRESSE;

Description du résultat : 5 colonnes dont les noms sont celles citées dans le SELECT (ADRESSE, CPA, etc)
ADRESSE contient toutes les lignes de TABLE1 ainsi que les CPA associées. Les colonnes associées à TABLE2 contiennent toutes la mention "[null]" càd qu'elles sont vides. Bien sûr le nom des deux colonnes avec la fonction to_char sont nommées "to_char", et type "text". Il n'y a pas de souci dans tout ça.

Le problème, comme expliqué c'est pourquoi n'ai-je pas les colonnes associées à TABLE2 remplies ?

Si je retire la 2ème partie de la condition et ne demande que :

FROM BASE.TABLE1 t1 LEFT OUTER JOIN BASE.TABLE2 t2 ON t1.ADRESSE = (t2.NUMERO || ' ' || t2.NOMVOIE)

Résultat : mêmes colonnes que la 1ère requête. Cette fois-ci, il y a bien sûr plus de 500 lignes : correct. Surtout, les colonnes NOMVOIE, NUMERO, et CPB sont remplies.

Comment faire pour faire marcher la 1ère requête. Merci smile

#7 Re : pgAdmin4 » Fonction to_char ne convertit pas integer en caractères » 08/05/2020 12:46:01

Merci rjuju. Effectivement, j'ai souvenir de l'avoir lu dans la doc mais hier je n'ai pas trouvé. Je regarderai à nouveau.

Petit souci : je compare deux CP, CPA et CPB, sur le CPB j'applique le to_char.
Dans le résultat, il n'y a pas de correspondance faite entre les CP. Alors que je sais que les deux tables ont des CP en commun. Donc pourquoi PGS refuse-t-il ?

CPA est enregistrée comme une char(8) dans ma table. J'ai fait un trim(CP) pour m'assurer qu'il n'y a pas d'espace après les 5 caractères du CP.
Lors de l'application du char_to, CPB apparaît en text dans le résultat (le type de variable est visible dans le nom de la colonne de résultat). Pourquoi n'est-ce pas une charvar ou au mieux un char(5) puisque je suppose que tous les CP sont de 5 caractères ?

Autre question : j'ai utilisé un char_to pour une autre variable numérique en l'indiquant dans le SELECT du code, afin de ne pas alourdir le "ON + condition". Dans la condition, j'ai utilisé de la variable. Mon code marche.
Par contre, si je fais la même chose avec le char_to pour le CP (donc dans le SELECT puis utilisation du CP dans la condition de la requête), PGS renvoie une erreur. Si je mets le char_to dans la condition directement, le code marche mais la colonne du résultat pour CPB est vide -> d'où les questions ci-haut.
Donc pourquoi le char_to au niveau du SELECT marche dans un cas et pas dans l'autre ?
Merci!

#8 pgAdmin4 » Fonction to_char ne convertit pas integer en caractères » 07/05/2020 21:44:14

databaser
Réponses : 5

Bonjour,

Afin de convertir un integer en caractères, j'utilise la fonction to_char :

SELECT to_char(CP, '999') FROM MABASE.MATABLE WHERE CP = '75000'; 

Le résultat obtenu est une cellule contenant ###

Que se passe-t-il ? Rien n'est indiqué dans le tuto PGS. Merci big_smile

#9 Re : Général » traitements sur la version 9.6 PGS copiés sur la version 10 » 19/03/2020 12:22:09

J'imagine que vous avez configuré une connexion vers deux versions différentes de postgres.

=> Oui puisque j'ai installé pgAdmin4 et PGS10. Au lancement, ils ont du demander la configuration de PGS10.


Je viens de voir que toutes les tables et les vues que j'ai créées sur le serveur PGS10 ont été créées dans PGS 9.6. Est-ce normal ?

Non, et la réponse est la même pour les autres questions : vous avez probablement effectué vos traitements sur la mauvaise connexion / mauvais onglet / mauvaise fenêtre.

J'utilise PG10 depuis les réponses ci-dessus. Créer, par exemple, une vue dans PGS10 la crée automatiquement dans PGS9.6 mais je me connecte sur le serveur PGS10 au lancement de pgAdmin4. Donc je n'utilise pas une mauvaise connexion et quand j'effectue des traitements sous PGS10, je ne suis pas connectée à PGS9.6.
Autre question : aujourd'hui, j'ai pu me connecter aux deux serveurs en même temps alors que d'habitude, sauf erreur de ma part, cliquer sur PGS9.6 alors que j'étais connectée à PGS10 demandait à se déconnecter du serveur utilisé pour accéder à l'autre...


Dois-je supprimer l'un des deux ? 9.6 je suppose puisque c'est le plus ancien ?

Ce sont vos données, c'est vous qui voyez.

D'accord mais le risque, au vu des remarques ci-dessus, si je supprimer PGS9.6, cela supprimera-t-il automatiquement les tables et vues que j'ai créées dans PGS10 ?
Merci big_smile

#10 Re : PL/pgSQL » données supplémentaires après la dernière colonne attendue » 13/01/2020 23:20:25

rjuju a écrit :

Le problème se trouve à priori dans votre fichier.  Vous pouvez par exemple essayer de supprimer des lignes pour isoler la ou les lignes posant soucis afin de comprendre plus facilement le problème, ou exporter au même format des lignes dans la table actuelle (ou avec les mêmes colonnes) pour comparer.

Merci. Exporter au même format ?

#11 PL/pgSQL » données supplémentaires après la dernière colonne attendue » 11/01/2020 20:30:56

databaser
Réponses : 4

Bonjour,

Encore une erreur de type

ERROR:  ERREUR:  données supplémentaires après la dernière colonne attendue

Le nombre de variables du fichier et du SQL est identique. A la fin des lignes, pas de ;. Après la dernière ligne, pas de ligne vide, je l'ai supprimé.

 COPY MATABLE FROM 'monchemin\nomfichier.csv' with delimiter ';' NULL as '' CSV header; 

Les valeurs des champs ne sont entre "" mais j'ai déjà chargé ce type de fichier, ça marchait. La dernière colonne contient des dates de format Year-Month-Day mais je ne pense pas que les - qui posent problème...

Où se loge l'erreur s'il vous plait ? Merci smile

#12 Général » traitements sur la version 9.6 PGS copiés sur la version 10 » 20/10/2019 15:38:49

databaser
Réponses : 4

Bonjour,


Sur PgAdmin 4, j'avais installé PostgreSQL 9.6 et PostgreSQL 10. Je viens de voir que toutes les tables et les vues que j'ai créées sur le serveur PGS10 ont été créées dans PGS 9.6. Est-ce normal ?

Du coup, je pense qu'il est possible que cela m'ait induit en erreur et qu'il m'a du arriver d'utiliser PGS 9.6 au lieu de PGS 10! Pensez-vous que tous les traitements que j'ai fais en étant sur l'une des versions du serveur ont été automatiquement faits sur l'autre en parallèle ?

Dois-je supprimer l'un des deux ? 9.6 je suppose puisque c'est le plus ancien ?

Merci d'avance.

#13 Re : PL/pgSQL » LEFT OUTER JOIN, WHERE et un POSIX » 19/08/2019 17:09:13

Euh... T1 est la table de gauche donc toutes les lignes de T1 sont gardées et si elles n'ont pas de correspondance dans T2, les cellules prennent la valeur NULL, non ?

Oui, en passant le c.CP ~ '^76'  dans le FROM, le problème est résolu. Mon exemple n'était pas très pertinent puisque ça ne sert à rien d'indiquer que la CP commence par 76!! big_smile La requête est plus pertinente lorsqu'il s'agit de chercher des noms de communes dans T2 avec la condition de jointure c.CP commençant par 76 car des noms de communes peuvent être identiques tout en se trouvant dans différents départements.
Merci smile

Je veux bien la différence entre un LEFT JOIN et un OUTER LEFT JOIN ? Merci smile

#14 Re : PL/pgSQL » LEFT OUTER JOIN, WHERE et un POSIX » 14/07/2019 21:55:28

 SELECT DISTINCT f.CP1, c.CP
FROM BDD.T1 f LEFT OUTER JOIN BDD.T2 c ON f.CP1 = c.CP
ORDER BY f.CP1
WHERE c.CP ~ '^76'; 

T1 : table dont je veux vérifier les CP au moyen de T2. T1 contient les CP : CP1, et les noms des communes NOM
T2 : table comprenant les CP des communes de France et le nom des communes : contient CP : CP, et les noms des communes : NOMCOM

Le résultat de la requête est différent si je retire la condition WHERE. Pourquoi ? WHERE c.CP ~ '^76' signifie : les CP commençant par 76 dans T2, non ? Merci smile

#15 PL/pgSQL » LEFT OUTER JOIN, WHERE et un POSIX » 14/07/2019 21:08:47

databaser
Réponses : 5

Bonjour,

Prise de tête avec un LEFT OUTER JOIN dont le résultat ne contenait pas toutes les lignes de la table de gauche. C'est la condition : WHERE c.CP ~ '^76';
qui posait problème. Néanmoins, pourriez-vous m'expliquer pourquoi ?
Je cherchais à joindre deux tables au moyen du CP, la table ne gauche ne contient que des 76... et la droite d'autres départements d'où la condition qui doit signifier "parmi les CP commençant par 76". Ai-je faux à la condition ? Sinon, qu'est-ce ?
Merci, smile

#16 Général » Jointures » 10/08/2018 21:33:35

databaser
Réponses : 1

Bonjour,


Dans quels cas d'utilisation la jointure croisée (CROSS JOIN) est-elle utilisée ? Quel en est l'intérêt ?

Quelle est la différence entre LEFT OUTER JOIN et LEFT JOIN ?

Merci! smile

#17 Re : Général » Cas d'application Fonction de table » 23/07/2018 16:35:22

Pardon, PG10 = la documentation Postgresql 10.3, celle que l'on télécharge sur le site.
7.2.1.4 Fonctions de table, p.110 du PDF
Dans la suite du doc, une référence est faite avec XML, mais je ne pense pas que ce type de fonction se limite à XML.
J'ai lu cette sous-partie en voulant lire tout sur la partie relative aux requêtes. Merci smile

#18 Général » Cas d'application Fonction de table » 23/07/2018 10:31:44

databaser
Réponses : 3

Bonjour,


A quoi sert une "fonction de table", présentée dans la doc PGS10 ? Quelles sont ses applications ? A quoi servent-elles ? J'ai du mal à me projeter...
Sur Google, taper "fonction de table" ne renvoie rien...
Merci smile

#19 Général » Comportement nom colonne non réservé mot-clé SQL » 22/07/2018 18:34:55

databaser
Réponses : 1

Bonjour,

Avec pgAdmin4, j'ai un souci avec le nom de colonne ID.
Or, SELECT DISTINCT contenant ID a plusieurs comportements :
* ID tout court, la requête fonctionne. Néanmoins, le mot s'inscrit en lettres violet. -> Pourquoi est-ce en lettres bleues alors ce n'est pas un mot réservé selon l'annexe C "Mot-clé SQL" de la doc PGS10 ?
* 'ID' avec des quotes, le mot devient marron (comme les commentaires). La requête tourne sans arrêt. Si je stoppe, j'obtiens une colonne dans les résultats intitulée " ?column? " et les cellules remplies par des ID, ID, ID, ...
* entre "", "ID" (pour utiliser un mot réservé comme nom de colonne), le mot redevient noir. Mais la requête s'affiche comme erronée "la colonne ID n'existe pas", SQL state: 42703
Character: 37.
* si dans le SELECT j'indique NomTable.ID (sans quotes ou ""), la partie ID devient bleue et le reste noir.

Quésako ? sad Quelle présentation dois-je utiliser pour citer le nom de la colonne ? Merci smile

#20 PL/pgSQL » Comportement nom colonne non réservé mot-clé SQL » 22/07/2018 13:21:13

databaser
Réponses : 1

Bonjour,

Avec pgAdmin4, j'ai un souci avec le nom de colonne ID.
Or, SELECT DISTINCT contenant ID a plusieurs comportements :
* ID tout court, la requête fonctionne. Néanmoins, le mot s'inscrit en lettres violet. -> Pourquoi est-ce en lettres bleues alors ce n'est pas un mot réservé selon l'annexe C "Mot-clé SQL" de la doc PGS10 ?
* 'ID' avec des quotes, le mot devient marron (comme les commentaires). La requête tourne sans arrêt. Si je stoppe, j'obtiens une colonne dans les résultats intitulée " ?column? " et les cellules remplies par des ID, ID, ID, ...
* entre "", "ID" (pour utiliser un mot réservé comme nom de colonne), le mot redevient noir. Mais la requête s'affiche comme erronée "la colonne ID n'existe pas", SQL state: 42703
Character: 37.
* si dans le SELECT j'indique NomTable.ID (sans quotes ou ""), la partie ID devient bleue et le reste noir.

Quésako ? sad Quelle présentation dois-je utiliser pour citer le nom de la colonne ? Merci smile

PS : pgSQL c'est bien pour le SQL en général ? "pg" signifie postgre ? J'ai recréé le post dans Général car ce n'est pas lié au pgSQL! Donc, vous pouvez supprimer celui-ci svp... Merci! smile

#21 Re : Général » données supplémentaires après la dernière colonne att » 17/06/2018 15:15:35

Pour la partie de la question sur les données supplémentaires, j'avais oublié des variables dans mon code et après rectification, il fonctionne sad
Inattention due au nombre de variables...
Merci à tous!

#22 Re : Général » données supplémentaires après la dernière colonne att » 04/06/2018 10:37:50

Rq : Une cellule vide est mentionnée par ;=""; dans le CSV ouvert ds Notepad++. Or il apparaît que parfois, elle est mentionnée par ;; sans rien d'autre. Est-ce que cela influence le téléchargement ? Non à priori un autre fichier avec le même souci a été correctement COPY FROM.
A quoi cela est-ce dû ? Un problème d'enregistrement ? Une colonne qui aurait contenu des données que l'on aurait supprimées ? Pb de jointure je pense.

Autre rq : Notepad++ indique 2048 lignes (2047 car la dernière est entièrement vide) alors que PGS (dans une autre version du fichier, avec moins de colonnes) compte 2042 lignes (2043 avec la lignes des noms de colonnes). Pourquoi cette différence de 4 lignes ?
Merci! smile

#23 Re : Général » données supplémentaires après la dernière colonne att » 01/06/2018 21:05:42

Après suppression du ";", même résultat : "ERROR:  ERREUR:  données supplémentaires après la dernière colonne attendue"
Je ne sais pas si c'est utile de préciser la suite de l'erreur : "CONTEXT:  COPY fin, ligne 2 : «..."

#24 Re : Général » données supplémentaires après la dernière colonne att » 01/06/2018 17:19:48

j'ai un nombre de ";" égal au nombre de colonnes, donc il faut enlever le dernier ";", c'est bien cela ?
Le souci c'est que j'ai trop de lignes et de colonnes pour faire ça manuellement. Une idée ? Faut-il passer par du codage sous Python ou R ? Merci...

#25 Re : Général » données supplémentaires après la dernière colonne att » 01/06/2018 16:15:29

oui. Toutes les colonnes sont ainsi : ="contenu cellule"; (je vois cela qd j'ouvre dans le bloc-notes) Donc la dernière colonne est de cette forme. En quoi est-ce que le ";" de la fin de ligne est gênant ? Que faire ? Merci smile

Pied de page des forums

Propulsé par FluxBB