Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL
PostgreSQL Forum PostgreSQL. Avant de poster -> F.A.Q PostGreSQL Tutoriels PostGreSQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 15/08/2006, 18h43   #1
Membre émérite
 
Avatar de julien.63
 
Inscription : décembre 2005
Messages : 1 322
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 1 322
Points : 981
Points : 981
Envoyer un message via MSN à julien.63
Par défaut faire une requête sur plusieurs tables

Salut,
Comme le titre l'indique, j'aimerai faire une requête sur deux tables à la fois.
je suis franchement pas champion en requête.

Mes deux tables se présentent comme ça :
champs table "gns" :
  • full_name
  • cc1
  • adm1
  • fc
  • long
  • lat

champs table us_names
  • feature_name
  • state_alpha_code
  • state_number_code
  • country_number_code
  • primary_longitude_dd
  • primary_latitude_dd

voici la requête que j'ai essayé :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT	
gns.full_name,	
gns.cc1, 
gns.adm1, 
gns.fc, 
trim(gns.long), 
trim(gns.lat),
us_names.feature_name, 
us_names.state_alpha_code, 
us_names.state_number_code, 
us_names.country_number_code, 
trim(us_names.primary_longitude_DD),
trim(us_names.primary_latitude_DD)
FROM gns, us_names
WHERE gns.full_name, us_names.feature_name
LIKE 'New York'
ORDER BY gns.full_name, us_names.feature_names
Je lance la requête sous phpPgAdmin. Ca tourne un moment, puis rien.
Avez-vous une idée de ce qui ne convient pas?

Et puis par curiosité :
Est ce qu'il vaut mieux faire une requête de ce type (enfin qui fonctionne ) ou alors deux requêtes séparés et ensuite faire un array_merge() ?

Merci pour vos conseils
julien.63 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/08/2006, 21h34   #2
Membre chevronné
 
Avatar de Spoutnik
 
Homme
Inscription : octobre 2003
Messages : 668
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 32
Localisation : Etats-Unis

Informations forums :
Inscription : octobre 2003
Messages : 668
Points : 746
Points : 746
Hello


Code :
1
2
3
 
WHERE gns.full_name, us_names.feature_name
LIKE 'New York'
Cette partie ne peut marcher.
Dans le WHERE, tu dois mettre les conditions de sélection (ici, tu utilise un 'LIKE'), et/ou les jointures entre les tables, ce que tu ne fais pas.
Il n'y a pas de lien entre ta table gns et us_names.
Je *suppose* que le lien se fait sur les champs 'gns.full_name, et us_names.feature_name', il faut transformer cette partie de requete en :
Code :
1
2
3
 
WHERE gns.full_name = us_names.feature_name
AND gns.full_name LIKE 'New York'
Si ca ne donne pas ce que tu veux, donne les requetes create table, jeux d'essais, et quels sont les champs de jointures, un peu plus de précision en gros
Citation:
Je lance la requête sous phpPgAdmin. Ca tourne un moment, puis rien.
Avez-vous une idée de ce qui ne convient pas?
normal, pas de jointure entre tes 2 tables = produit cartésien. En gros, tu recopie toutes les lignes de la table de droite ou chaque entrée de la table de gauche (soit nb_lignes(tables1)* nb_lignes(tables2) lignes retournées). Tu déclenche donc probablement le timeout de pgAdmin et/ou la taille max de résultat.
Citation:
Et puis par curiosité :
Est ce qu'il vaut mieux faire une requête de ce type (enfin qui fonctionne ) ou alors deux requêtes séparés et ensuite faire un array_merge() ?
Le SQL est fait pour ce type d'utilisation. Pas à hésiter, il faut mieux le faire en SQL qu'en quoi que ce soit d'autre.

plus d'info sur les jointures :
++
__________________
Two beer or not two beer. (Shakesbeer)
Question technique par MP => poubelle!
Spoutnik est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/08/2006, 23h33   #3
Membre émérite
 
Avatar de julien.63
 
Inscription : décembre 2005
Messages : 1 322
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 1 322
Points : 981
Points : 981
Envoyer un message via MSN à julien.63
J'ai une bonne et une mauvaise nouvellle :
La bonne c'est que la requête marche grâce à tes conseils !

La mauvaise c'est que c'est pas le résultat que je cherche. J'obtiens un tableau de 96 lignes qui correspond aux produits des deux résultats. je m'explique.

si j'effectue chaque requête séparement:

Code :
1
2
3
4
5
6
7
8
9
10
SELECT	
gns.full_name,	
gns.cc1, 
gns.adm1, 
gns.fc, 
trim(gns.long), 
trim(gns.lat)
FROM gns
WHERE gns.full_name LIKE 'New York'
ORDER BY gns.full_name
donne 12 lignes

Code :
1
2
3
4
5
6
7
8
9
10
SELECT	
us_names.feature_name, 
us_names.state_alpha_code, 
us_names.state_number_code, 
us_names.country_number_code, 
trim(us_names.primary_longitude_DD),
trim(us_names.primary_latitude_DD)
FROM us_names
WHERE us_names.feature_name LIKE 'New York'
ORDER BY us_names.feature_name
donne 8 lignes

Si je fais les deux requêtes en une :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT	
gns.full_name,	
gns.cc1, 
gns.adm1, 
gns.fc, 
trim(gns.long), 
trim(gns.lat),
us_names.feature_name, 
us_names.state_alpha_code, 
us_names.state_number_code, 
us_names.country_number_code, 
trim(us_names.primary_longitude_DD),
trim(us_names.primary_latitude_DD)
FROM gns, us_names
WHERE gns.full_name = us_names.feature_name
AND gns.full_name LIKE 'New York'
ORDER BY gns.full_name, us_names.feature_name
alors pour chaque ligne trouvées dans la table us_names, il me repète les douze lignes trouvées dans la table gns.
8x12 = 96

En fait, je cherche à sortir tous les enregistrements de la table gns dont full_name LIKE 'New York' (par exemple) et tous les enregistrements de la table de us_names dont feature_name LIKE 'New York'. Soit un total de 20 lignes.
julien.63 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/08/2006, 23h39   #4
Membre chevronné
 
Avatar de Spoutnik
 
Homme
Inscription : octobre 2003
Messages : 668
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 32
Localisation : Etats-Unis

Informations forums :
Inscription : octobre 2003
Messages : 668
Points : 746
Points : 746
Citation:
En fait, je cherche à sortir tous les enregistrements de la table gns dont full_name LIKE 'New York' (par exemple) et tous les enregistrements de la table de us_names dont feature_name LIKE 'New York'. Soit un total de 20 lignes.
D'après ce que je comprend :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
SELECT	
gns.full_name,	
gns.cc1, 
gns.adm1, 
gns.fc, 
trim(gns.long), 
trim(gns.lat)
FROM gns
WHERE gns.full_name LIKE 'New York'
 
UNION
SELECT 
us_names.feature_name, 
us_names.state_alpha_code, 
us_names.state_number_code, 
us_names.country_number_code, 
trim(us_names.primary_longitude_DD),
trim(us_names.primary_latitude_DD)
FROM us_names
WHERE us_names.feature_name LIKE 'New York'
 
ORDER BY gns.full_name,us_names.feature_name
PS / ton like est inutile ici, car tu n'utilise par de caractères 'spéciaux' tels que %. Ton LIKE équivaut à un '=', qui serait, je pense un peu plus rapide (pas sur, mais dans le doute )

++
__________________
Two beer or not two beer. (Shakesbeer)
Question technique par MP => poubelle!
Spoutnik est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2006, 22h58   #5
Membre émérite
 
Avatar de julien.63
 
Inscription : décembre 2005
Messages : 1 322
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 1 322
Points : 981
Points : 981
Envoyer un message via MSN à julien.63
oui ça marche !
Merci
@+
Julien
julien.63 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h22.


 
 
 
 
Partenaires

Hébergement Web