de l'utilité du "from t1 a , t1 b" - SQL/NoSQL - Programmation
Marsh Posté le 05-06-2007 à 22:43:38
Exemple:
Table1: (id / prenom)
1 / Pierre
2 / Paul
3 / Jacques
Table2: (id / nom)
1 / Dupont
2 / Durant
3 / Ducon
1er Requête :
Select a.nom,a.id,b.id,b.prenom |
Résultat:
Dupont,1,1,Pierre
Durant,2,1,Pierre
Ducon,3,1,Pierre
Dupont,1,2,Paul
Durant,2,2,Paul
Ducon,3,2,Paul
Dupont,1,3,Jacques
Durant,2,3,Jacques
Ducon,3,3,Jacques
Tu as un produit cartésien table1 x table 2
2eme Requête :
Select a.nom,a.id,b.id,b.prenom |
Résultat:
Dupont,1,1,Pierre
Durant,2,2,Paul
Ducon,3,3,Jacques
Plus simple tu meurs
Edit: en gros la requête 2 fait ca:
Dupont,1,1,Pierre Durant,2,1,Pierre Ducon,3,1,Pierre Dupont,1,2,Paul
Durant,2,2,Paul Ducon,3,2,Paul Dupont,1,3,Jacques Durant,2,3,Jacques
Ducon,3,3,Jacques
Marsh Posté le 06-06-2007 à 18:54:44
donc comme je le pensai, faire :
select champ1, champ2
from table1 a, table1 b
where champ4 = 'toto'
and a.id = b.id;
ne sert strictement à rien ...
Marsh Posté le 09-06-2007 à 12:30:35
crapodesiles a écrit : donc comme je le pensai, faire : |
on sait pas ce que c'est que le champ4 ni dans quelle table il est, donc ton exemple ne veut strictement rien dire.
Reprenons
Table 1 : user (id_user | nom_user)
Table 2 : adresse (id_adresse | id_user | libelle_adresse)
Dans la table 1 on a :
1 / Robert
2 / Michel
Dans la table 2 on a :
1 / 1 / 79 rue du poirier
2 / 2 / 45 rue des pommiers
Tu veux récupérer l'adresse de Michel
Solution 1 : (nawak)
select a.nom_user, b.libelle_adresse
from user a, adresse b
where a.nom_user = 'Michel'
Tu auras comme résultat :
Michel / 79 rue du poirier
Michel / 45 rue des pommiers
==> donc c'est tout faux.
Si tu ajoutes dans la clause where : "and a.id_user = b.id_user"
tu auras bien : Michel / 45 rue des pommiers
Marsh Posté le 09-06-2007 à 15:48:00
Euh juste au passage.. pourquoi vous parlez d'une table2 ?
Moi dans son exemple je vois:
table1 ( #id, champ1, champ2, champ4, ... )
contenant par exemple
{1, Durand, Robert, durand@robert.fr }
{2, Julia, Didier, toto }
{3, Henry, Thierry, thenry@fff.fr }
donc
select champ1, champ2 |
renvoie {Julia, Didier}
(voir si eventuellement il ne faut pas préciser de quelle table (a ou b) on tire champ1 et champ2 dans la clause select)
et
select champ1, champ2 |
renvoie aussi {Julia, Didier}
donc dans cet exemple l'utilité du "from t1 a , t1 b" je ne la vois pas...
Marsh Posté le 09-06-2007 à 17:43:47
effectivement, j'avais pas vu que c'était sur la même table
Donc non, aucun intéret
Toujours est-il que sa question est loin d'être claire. Est-ce que l'exemple du premier post résume bien sa question ? J'en suis pas sûr.
Est-ce que sa question porte simplement sur l'utilité du "from t1 a, t1 b" comme le laisse supposer le titre du topic ?
Ca change tout
Marsh Posté le 11-06-2007 à 10:22:00
Pffffffff
Ca vous arracherait le cul de repecter un tant un soit la norme ?
Si un champ dans une clause WHERE / ORDER BY ou GROUP BY peut porter à confusion (y compris -ET SURTOUT- dans le cas où on sélectionne deux fois le même champs dans la même table) ça provoque une erreur. C'est ce que dit la norme. Après, MySQL peut faire de la merde, arrêtez de prendre ça comme une règle !
Le nom qui suit un nom de table s'appelle un "alias". Ce nom permet de préfixer les champs des tables d'une façon presonnalisée dans la requête, ce qui permet d'améliorer la lisibilité. En cas d'appels successifs de la même table, cet alias permet de différencier les différents appels à cette même table.
Mettons par exemple les deux tables :
device
---------
id
name
price
property
---------
device_id
code
value
Avec les informations :
device
id name price
1 pro1 100 €
2 pro2 150 €
3 pro3 25 €
property
device_id code value
1 FAM VGA
1 BUS AGP
1 SPD 4x
2 FAM VGA
2 BUS PCI-E
2 SPD 16x
3 FAM NET
3 BUS PCI
3 SPD 1 Gb
=> Je veux connaître le nom, le type de bus et le prix des cartes graphiques
select d.name, bus.value, d.price
from device d
inner join property vga on vga.device_id = d.id and vga.code = 'FAM' and vga.value = 'VGA'
inner join property bus on bus.device_id = d.id and bus.code = 'BUS'
=> Sans alias cette requête est impossible à faire. Et il est important que le "code" de property selon si on parle de "vga" ou de "bus" soit différent si on veut effectuer les filtres désirés.
Marsh Posté le 12-06-2007 à 00:24:30
MagicBuzz a écrit : Ca vous arracherait le cul de repecter un tant un soit la norme ? |
respecte au moins la langue française
Marsh Posté le 12-06-2007 à 10:29:26
ah ouais si j'ai oublié un s il est vrai
c'est parceque le S ça ressemble un poil de cul et je l'ai arraché
au ouais pis j'ai oublié un mot aussi.
ouais mais peu et pet ça se ressemble
bon, ok, je vais me coucher. relou
Marsh Posté le 12-06-2007 à 11:48:27
Dans l'exemple on peut pas trop voir à quoi ça sert mais je me rappelle que pour une intersection sous sqlserver, j'avais eu besoin de faire un truc du genre.
Marsh Posté le 12-06-2007 à 11:49:52
ReplyMarsh Posté le 12-06-2007 à 11:53:55
Dans cet exemple aussi si tu préfères :
Code :
|
Ou celui-ci si tu préfère :
Code :
|
Ou encore celle-là :
Code :
|
Marsh Posté le 12-06-2007 à 11:55:13
Pablo Escrobarbe a écrit : Oui mais tu as compliqué inutilement je trouve |
Nan, mes deux dernières requêtes sont relativement complexes, je te l'accorde (mais simples). Et dans mon exemple initial, non,j'ai rien compliqué du tout, c'est l'exemple typique : je cherche deux infos différentes depuis la même table à des lignes différentes, donc j'utilise un alias. C'est l'utilisation classique d'un alias.
Marsh Posté le 12-06-2007 à 12:27:19
Oui oui en fait j'avais lu trop vite, j'ai hésité à m'éditer vite fait mais j'ai eu l'honnêteté de garder ma connerie
Marsh Posté le 12-06-2007 à 13:33:24
non mais que les alias soient utiles on est tous d'accord, c'est pas la question.
Le problème c'est l'exemple donnée dans le premier post qui est complètement ridicule
je rappelle :
select champ1, champ2
from table1 a, table1 b
where champ4 = 'toto'
and a.id = b.id
Cette requête n'est pas valide et ne ressemble à rien.
Avec un cas concret de la part de l'auteur de ce topic on pourrait peut être donner une réponse valable.
Mais tant que je ne sais pas ce qu'il veut....
Marsh Posté le 12-06-2007 à 14:25:27
ah ben le premier, oui. et c'est pour ça que j'ai parlé de pets de cul arrachés, parceque non seulement c'est débile, mais en plus ça marche pas
Marsh Posté le 15-06-2007 à 01:26:02
Pour la question du monsieur qui as poster le premier post,
je croie (du moin en lisant le titre du topique) qu'il parle de cas où on selectionne 2 fois un meme champ dans la meme table, par exemple:
On a une table:
Film( titre, duree, nationalité, realisateur )
on veut par exemple trouver quels sont les titres des films réalisés par le realisateur de "Waterworld"
On fesant l'analyse en langage prédicatif on as un truc du genre:
{ f1.titre / Film(f1) & IL_EXISTE f2 ( Film(f2) & f2.titre='Waterworl' & f2.realisateur=f1.realisateur ) }
On as utilisé un meme champ 2 fois from la meme table avec une condition f2.realisateur=f1.realisateur
Ce qui donne en SQL:
Citation : Select titre |
Ou d'une autre magnére:
Citation : Select f1.titre |
Ce qui est -je trouve- proche de l'exemple qui a été donnée dans le premier post:
Citation : select champ1, champ2 |
Marsh Posté le 15-06-2007 à 09:27:19
ouais, mais comme je disais "champ1", "champ2" et "champ4" doivent obligatoirement être préfixés si on veut que ça requête marche
et généralement, on évite de joindre une table sur elle-même via sa clé primaire (id) puisque... bah ça sert à rien
Marsh Posté le 05-06-2007 à 22:34:44
Salut,
je souhaite savoir à quoi sert , quel resultat obtient t'on avec une requete du type
select champ1, champ2
from table1 a, table1 b
where champ4 = 'toto'
and a.id = b.id;
a quoi sert le test d'egalité a.id = b.id ?
quel operation effectue t'il ?
Merci