PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

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

#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 smile


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

edlm a écrit :

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

Pied de page des forums