Précédent   Forum du club des développeurs et IT Pro > Bases de données > PostgreSQL > Requêtes
Requêtes Forum d'entraide sur les requêtes SQL spécifiques à PostgreSQL, les triggers, les vues, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 11/12/2012, 10h13   #1
Madfrix
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 323
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 323
Points : 2 374
Points : 2 374
Par défaut Algorithme pour une requête

Hello,

Admettons 3 colonnes x, y, z d'une table au format numérique.

Champs des possibles :
  • x-> [1-9]
  • y-> [1-500]
  • z-> [1-15]

Ce sont en fait des coordonnées au format (x,y,z). Nous pouvons donc avoir par exemple les coordonnées (2,458,3) ou (1,500,15), etc. Il y a donc au total 9*500*15 = 67500 possibilités.

Ce que je souhaite faire, c'est trouver toutes les coordonnées "non prises". Par exemple si j'ai 438 coordonnées prises, je souhaite une requête me retournant toutes les 67500-438=67062 coordonnées restantes.

J'avais déjà fait il y a quelques années une requête de ce style avec une table "témoin" contenant toutes mes coordonnées et je faisais une sorte de MINUS pour trouver les coordonnées restantes.

Ce que je souhaite savoir, c'est si, pour ce genre de requête, on peut éviter de créer une nouvelle table ? Faire une requête SQL qui elle même génère "en interne" les 67500 possibilités afin de trouver les coordonnées non prises ?

Merci
__________________
Je ne réponds pas aux questions envoyées par mp
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2012, 12h12   #2
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 4 068
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 37
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 4 068
Points : 8 988
Points : 8 988
Bonjour,

Il n'est pas nécessaire de créer une table temporaire pour cela, la fonction generate_series() fait l'affaire.
Pour générer toutes les combinaisons possibles dans ton cas, la requête suivante suffit de faire :
Code :
1
2
3
4
5
SELECT x, y, z
FROM generate_series(1, 9) AS x
CROSS JOIN generate_series(1, 500) AS y
CROSS JOIN generate_series(1, 15) AS z
ORDER BY 1, 2, 3;
Ne reste plus qu'à faire une jointure externe entre cette première requête et les triplets dont tu disposes, pour ne garder que ce qui n'existe pas :
Code :
1
2
3
4
5
6
7
8
9
10
SELECT t1.x, t1.y, t1.z
FROM (
    SELECT x, y, z
    FROM generate_series(1, 9) AS x
    CROSS JOIN generate_series(1, 500) AS y
    CROSS JOIN generate_series(1, 15) AS z
) AS t1
LEFT JOIN ta_table t2 ON t1.x = t2.x AND t1.y = t2.y AND t1.z = t2.z
WHERE t2.x IS NULL
ORDER BY t1.x, t1.y, t1.z
__________________
Rédacteur / Modérateur SGBD
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/12/2012, 12h25   #3
Madfrix
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 323
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 323
Points : 2 374
Points : 2 374
Whoo épatant cette petite fonction generate_series() que je ne connaissais pas (mon ancienne requête était faite sous MySQL).

Je vais pouvoir m'en sortir facilement, tu m'as mâché le travail

Merci beaucoup !
__________________
Je ne réponds pas aux questions envoyées par mp
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 16h39.


 
 
 
 
Partenaires

Hébergement Web