Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#1 30/03/2012 11:13:19
- cafu3
- Membre
Aide sur requete
Bonjour,
J'ai mon select qui me renvoie ça :
--------------------
CAS1:
depart - arrivée
0 3
5 50
10 30
--------------------
CAS2:
depart - arrivée
5 50
10 30
20 40
--------------------
Je voudrais savoir si on peut trouver via SQL (avec les fonction window ???) que ces SELECT ont une "partie" commune (cf CAS2 : "partie" 20-30) ou pas (cf CAS1)
Merci d'avance si vous pouvez m'aider
Hors ligne
#2 30/03/2012 11:18:40
- gleu
- Administrateur
Re : Aide sur requete
Vous voulez dire 10-30 non ?
Si c'est bien ça, il est toujours possible de faire ça :
SELECT cas1.depart, cas1.arrivee FROM cas1, cas2 WHERE cas1.depart=cas2.depart and cas1.arriveet=cas2.arrivee;
Ça me semble tellement évident que je suppose que j'ai dû louper quelque chose
Guillaume.
Hors ligne
#3 30/03/2012 11:25:39
- cafu3
- Membre
Re : Aide sur requete
Euh je pense que vous avez pas bien compris ou que j'ai mal formulé ma question ...
En fait CAS1 et le résultat d'un premier SELECT
et CAS2 est le résultat d'un deuxième SELECT
Je cherche pour chaque SELECT si j'ai un intersection ou pas.
Dans le premier SELECT je n'ai pas d'intersection car la ligne depart=0 et arrivée=3 n'a pas d'intersection avec les autres lignes.
Dansle deuxième SELECT j'ai une intersection entre les trois lignes sur la partie 20-30
Est-ce plus clair ?
Hors ligne
#4 30/03/2012 12:07:52
- gleu
- Administrateur
Re : Aide sur requete
Je ne vois pas trop ce que ça change, il suffit de remplacer cas1 et cas2 pour les sous-requêtes. Vous pouvez aussi le coder avec une requête CTE ainsi :
WITH cas1 AS (SELECT...),
cas2 AS (SELECT...)
SELECT cas1.depart, cas1.arrivee
FROM cas1, cas2
WHERE cas1.depart=cas2.depart
AND cas1.arriveet=cas2.arrivee;
Guillaume.
Hors ligne
#5 30/03/2012 12:27:19
- cafu3
- Membre
Re : Aide sur requete
cas1 et cas sont deux résultats de la même requete.
je ne veux pas faire de jointure entre des deux requetes mais exploiter le resultat de chacune.
Est-ce compréhensible ce que je raconte ?
Hors ligne
#6 30/03/2012 12:34:25
- gleu
- Administrateur
Re : Aide sur requete
Non. Le plus simple serait de montrer la requête et son résultat.
Guillaume.
Hors ligne
#7 30/03/2012 13:15:45
- cafu3
- Membre
Re : Aide sur requete
CAS1:
SELECT depart,arrivée FROM matable where id=1
depart - arrivée
0 3
5 50
10 30
--------------------
CAS2:
SELECT depart,arrivée FROM matable where id=2
depart - arrivée
5 50
10 30
20 40
Hors ligne
#8 30/03/2012 13:26:16
- gleu
- Administrateur
Re : Aide sur requete
Donc c'est bien deux requêtes différentes. Bref, ça me donne ceci :
WITH cas1 AS (SELECT depart,arrivee FROM matable where id=1),
cas2 AS (SELECT depart,arrivee FROM matable where id=2)
SELECT cas1.depart, cas1.arrivee
FROM cas1, cas2
WHERE cas1.depart=cas2.depart
AND cas1.arrivee=cas2.arrivee;
Et la preuve que ça marche bien :
postgres=# create table matable (id integer, depart integer, arrivee integer);
CREATE TABLE
postgres=# insert into matable values (1, 0, 3);
INSERT 0 1
postgres=# insert into matable values (1, 5, 50);
INSERT 0 1
postgres=# insert into matable values (1, 10, 30);
INSERT 0 1
postgres=# insert into matable values (2, 5, 50);
INSERT 0 1
postgres=# insert into matable values (2, 10, 30);
INSERT 0 1
postgres=# insert into matable values (2, 20, 40);
INSERT 0 1
postgres=# select depart, arrivee from matable where id=1;
depart | arrivee
--------+---------
0 | 3
5 | 50
10 | 30
(3 rows)
postgres=# select depart, arrivee from matable where id=2;
depart | arrivee
--------+---------
5 | 50
10 | 30
20 | 40
(3 rows)
postgres=# WITH cas1 AS (SELECT depart,arrivee FROM matable where id=1),
cas2 AS (SELECT depart,arrivee FROM matable where id=2)
SELECT cas1.depart, cas1.arrivee
FROM cas1, cas2
WHERE cas1.depart=cas2.depart
AND cas1.arrivee=cas2.arrivee;
depart | arrivee
--------+---------
5 | 50
10 | 30
(2 rows)
Guillaume.
Hors ligne
#9 30/03/2012 13:58:35
- edlm
- Membre
Re : Aide sur requete
Est ce que ca ne serait pas plutôt ca que cherche à faire cafu3:
SELECT * FROM cas2 CROSS JOIN (SELECT max(depart), min(arrivee) FROM cas2) t(depart, arrivee) WHERE cas2.depart <= t.depart AND cas2.arrivee >= t.arrivee;
depart | arrivee | depart | arrivee
--------+---------+--------+---------
5 | 50 | 20 | 30
10 | 30 | 20 | 30
20 | 40 | 20 | 30
(3 rows)
à savoir identifier les lignes de la requête qui ont une plage commune.
Au passage, rien à voir avec le thread, mais je me demandais si il existait une passerelle FluxBB <==> mail parce que j'avoue que j'ai un peu de mal là... ;-) Désolé si je me rate au niveau du formatage... j'essaierai de faire mieux la prochaine fois si c'est le cas.
Éric
Hors ligne
#10 30/03/2012 14:01:43
- edlm
- Membre
Re : Aide sur requete
Eh bien voilà... désolé la requête que je tentais de faire passer était :
SELECT * FROM cas2 CROSS JOIN (SELECT max(depart), min(arrivee) FROM cas2) t(depart, arrivee)
WHERE cas2.depart <= t.depart AND cas2.arrivee >= t.arrivee;
depart | arrivee | depart | arrivee
--------+---------+--------+---------
5 | 50 | 20 | 30
10 | 30 | 20 | 30
20 | 40 | 20 | 30
(3 rows)
Éric
Hors ligne
#11 30/03/2012 14:09:28
- cafu3
- Membre
Re : Aide sur requete
edlm a bien compris ce que je voulais faire.
je vais essayer la requete voir si ca repond à mon besoin et faire un retour après
merci
Hors ligne
#12 30/03/2012 14:34:00
- gleu
- Administrateur
Re : Aide sur requete
je me demandais si il existait une passerelle FluxBB <==> mail parce que j'avoue que j'ai un peu de mal là... ;-)
Pas à ma connaissance. Si vous strouvez quelque chose comme ça, ça en intéressera plus d'un.
Guillaume.
Hors ligne
#13 30/03/2012 16:13:42
- cafu3
- Membre
Re : Aide sur requete
La jointure croisée était la bonne idée. Merci !
Par contre j'ai modifié la clause WHERE afin qu'elle reponde mieux à mon souhait !
Dernière modification par cafu3 (30/03/2012 18:39:27)
Hors ligne
Pages : 1