Bonjour à tous,

J'ai une petite requête qui m'ennuie, encore une fois .

J'ai essayé de cherché sur le forum, mais je n'ai rien trouvé, pourtant le sujet a déjà du être abordé.

Il s'agit d'une requête anniversaire.
J'ai une table agents avec des personnes dedans et leur date d'anniversaire. Le but étant de montré ceux qui sont naît le même jour et même moi.
Bien sûr, on évite de montré que A et naît le même jour que lui même ^^.

L'autre subtilité, c'est qu'il faut évité les doublons dans la réponse.
Par exemple si A et naît comme B
On doit voir dans la requête
A - B
mais pas B -A .

J'ai trouvé une solution (enfin, disons que l'on me l'a grandement suggéré ) mais j'en cherche une autre un peu moins complexe que ce que l'on m'a montré (bah ouais c'est pas un truc super compliqué pourtant :o).

Voilà sur quoi je travail actuellement, j'aimerais, plutôt que l'on me dise la réponse, que les personnes connaissant la réponse m'orientent sur celle-ci !

Voilà mon idée

Imaginons donc que nous avons une ligne avec A - B
je voulais rajouter deux colonnes, col1 avec A||B, col2 avec B||A.

Ainsi, si l'on regarde col1 et la première ligne et col2 de la deuxième, ce sont les mêmes, et donc peut être que l'on tien une piste pour montrer à SQL qu'il faut les éliminer...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
select view1.name1,view1.birth_date,view2.name2, name1||name2 col1, name2||name1 inversion
        from
        (
              (select last_name || ' ' || first_name name1, birth_date from agents) view1 
              inner join (select last_name || ' ' || first_name name2, birth_date from agents) view2
              on to_char(view1.birth_date,'dd/mm')=to_char(view2.birth_date,'dd/mm')
              and name1<>name2
        )
Malheureusement, c'est dans la suite que ça bloque, je ne vois pas dans quelle mesure je peux signaler qu'Oracle doit analyser ma table pour chercher à l'intérieur de la table les lignes où les ces deux colonnes sont égales et n'en garder qu'une sur les deux...

PS : ma réponse un peu bizarre

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
SELECT
      ag1,
      ag2
FROM
      (
      SELECT
            ag1,
            ag2
      FROM
            (
            SELECT
                  ag1,
                  ag2,
                  rownum counter
            FROM
                  (
                  SELECT
                        a1.first_name||' '||a1.last_name ag1,
                        a2.first_name||' '||a2.last_name ag2,
                        (a1.agent_id*a2.agent_id)+
(a1.agent_id+a2.agent_id) magic_id
                  FROM
                              agents a1
                        INNER JOIN
                              agents a2
                        ON
to_char(a1.birth_date,'DD-MON') = to_char(a2.birth_date,'DD-MON')
                  WHERE
                        a1.agent_id <> a2.agent_id
                  ORDER BY
                        magic_id
                  ) sub1
            ) sub2
      WHERE MOD(counter,2)=1
      ) sub3
ORDER BY
      ag1