Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1630 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Remplacer OR par JOIN

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Remplacer OR par JOIN

n°1852834
xtof_83
Freeride Spirit
Posté le 19-02-2009 à 10:05:03  profilanswer
 

Bonjour  
 
j'ai une table avec 3 champs:
id_el1   id_el2   id_type
avec comme contenu:
1            2          1
 
Mais c'est possible d'avoir:
2            1          1
 
C'est quoi la requête pour matcher cette ligne sachant que j'ai selon le contexte id_el1 = 1 et id_el2 = 2 ou id_el1 = 2 et id_el2 = 1
 
C'est possible avec un Left join, mais j'arrive pas...  
 
ps: je veux pas utiliser OR
 
Merci

mood
Publicité
Posté le 19-02-2009 à 10:05:03  profilanswer
 

n°1852840
flo850
moi je
Posté le 19-02-2009 à 10:13:49  profilanswer
 

tu es sur que tu n'as pas un soucis de structure de table ?  
 
est ce que tu ne devria pas ajouter une table intermediaire pour  faire le lien  
 
au lieu d'avoir  
table1:
idT1
donneest1
 
 
table2:
idT1
idT1bis
idT1ter
donnees
 
passer a une structure:  
table1
idT1
donneest1
 
tableLien
idT1
idT2
donnes spécifique a la jointure
 
table2:
idT2
donnees


---------------

n°1852846
xtof_83
Freeride Spirit
Posté le 19-02-2009 à 10:26:27  profilanswer
 

flo850 a écrit :

tu es sur que tu n'as pas un soucis de structure de table ?  
 
est ce que tu ne devria pas ajouter une table intermediaire pour  faire le lien  
 
au lieu d'avoir  
table1:
idT1
donneest1
 
 
table2:
idT1
idT1bis
idT1ter
donnees
 
passer a une structure:  
table1
idT1
donneest1
 
tableLien
idT1
idT2
donnes spécifique a la jointure
 
table2:
idT2
donnees


 
Non je pense pas...
 
Dans mon unique table id_el1 et id_el2 sont au sens sémantique pareil.
du style:  
 
Jean (1) est le cousin de Paul (2)
 
Donc dans la base on a bien:
id_el1 = 1
id_el2 = 2
 
Je pourrais dupliquer l'info, c'est certain... Mais là je veux la regrouper.
 
Donc avoir une requêtre qui me renvoie la ligne unique quelque soit le sens de id_el1 et id_el2:
id_el1 = 1
id_el2 = 2
ou
id_el1 = 2
id_el2 = 1
 
c'est mieux ?

n°1852917
xtof_83
Freeride Spirit
Posté le 19-02-2009 à 12:39:40  profilanswer
 

Actuellement j'ai:

 


Code :
  1. SELECT *
  2. FROM t1
  3. WHERE ((id_el1=1 AND id_el2=2) OR (id_el1=2 AND id_el2=1))
  4. AND type = 1


mais je veux pas de OR :(

 

Merci


Message édité par xtof_83 le 19-02-2009 à 14:38:36
n°1852941
MagicBuzz
Posté le 19-02-2009 à 13:34:48  profilanswer
 

Déjà, ta requête est fausse :
 

Code :
  1. SELECT *
  2. FROM t1
  3. WHERE ((id_el1=1 AND id_el2=2) OR (id_el1=2 AND id_el2=1))
  4. AND type = 1


 
Ca marchera beaucoup mieux.
 
Pkoi tu veux pas de OR ? (à cause de ce bug que je viens de corriger ?)
 
Sinon, par jointure, faudrait déjà que tu ait quelquechose à joindre... Genre deux tables. Là t'en a qu'une (??)
 
Avec un UNION à la limite... Genre histoire de faire simple et bien mettre à genoux ton serveur :
 

Code :
  1. SELECT *
  2. FROM (
  3.   SELECT id_el1 el1, id_el2 el2, type
  4.   FROM t1
  5.   union ALL
  6.   SELECT id_el2 el1, id_el1 el2, type
  7.   FROM t1
  8. ) t1
  9. WHERE el1 = 1 AND el2 = 2 AND type = 1


 
Mais bon, là t'as vraiment envie de tout mettre par terre.
 
Par contre, un truc pas con, ce serait de mettre en place un trigger sur t1 qui crée instantanément la ligne inverse.

n°1852988
joce
Architecte / Développeur principal
"BugHunter"
Posté le 19-02-2009 à 14:43:43  profilanswer
 

Je suis à 3m de toi et tu viens même pas me poser la question, shame on you xtof :D


---------------
Protèges carnets personnalisés & accessoires pour bébé
n°1852989
flo850
moi je
Posté le 19-02-2009 à 14:45:33  profilanswer
 

tu lui fais peur :o


---------------

n°1852990
joce
Architecte / Développeur principal
"BugHunter"
Posté le 19-02-2009 à 14:48:15  profilanswer
 

flo850 a écrit :

tu lui fais peur :o


Probablement :o
 
Sinon moi j'utilise :  
 
SELECT * FROM t1 WHERE id_el1=1 AND id_el2=2 AND type = 1  
UNION
SELECT * FROM t1 WHERE id_el1=2 AND id_el2=1 AND type = 1  
 
(on peut pas avoir les deux lignes présentes en même temps dans la db, et au pire limit 1 et rulez)


---------------
Protèges carnets personnalisés & accessoires pour bébé
n°1852994
xtof_83
Freeride Spirit
Posté le 19-02-2009 à 14:53:23  profilanswer
 

joce a écrit :


Probablement :o
 
Sinon moi j'utilise :  
 
SELECT * FROM t1 WHERE id_el1=1 AND id_el2=2 AND type = 1  
UNION
SELECT * FROM t1 WHERE id_el1=2 AND id_el2=1 AND type = 1  
 
(on peut pas avoir les deux lignes présentes en même temps dans la db, et au pire limit 1 et rulez)


 
thx boss,  [:mc ewans]

n°1852998
MagicBuzz
Posté le 19-02-2009 à 15:00:01  profilanswer
 

c'est bien la peine de se faire chier à répondre tiens :o
 
et le ALL au UNION bordel :o

mood
Publicité
Posté le 19-02-2009 à 15:00:01  profilanswer
 

n°1853015
xtof_83
Freeride Spirit
Posté le 19-02-2009 à 15:40:40  profilanswer
 

MagicBuzz a écrit :

c'est bien la peine de se faire chier à répondre tiens :o
 
et le ALL au UNION bordel :o


 

Citation :

The default behavior for UNION is that duplicate rows are removed from the result. The optional DISTINCT keyword has no effect other than the default because it also specifies duplicate-row removal. With the optional ALL keyword, duplicate-row removal does not occur and the result includes all matching rows from all the SELECT statements.


 
1_ logiquement on a pas de duplicate
2_ s'il y en avait j'en voudrais pas ;)
 
Merci pour tout ;)

n°1853019
MagicBuzz
Posté le 19-02-2009 à 15:43:27  profilanswer
 

Le ALL n'est pas là pour rajouter des duplicates, mais pour optimiser la requête de façon drastique : sans ALL, le SGBD va se faire chier à vérifier que les lignes sont bien uniques. Vu que tu le sais déjà, ça sert à rien de lui faire faire le travail deux fois ;)

n°1853052
joce
Architecte / Développeur principal
"BugHunter"
Posté le 19-02-2009 à 16:49:05  profilanswer
 

MagicBuzz a écrit :

Le ALL n'est pas là pour rajouter des duplicates, mais pour optimiser la requête de façon drastique : sans ALL, le SGBD va se faire chier à vérifier que les lignes sont bien uniques. Vu que tu le sais déjà, ça sert à rien de lui faire faire le travail deux fois ;)


Ouaip ;) Enfin ceci dit, c'est de l'ultra micro optimisation vu que chaque SELECT ne peut renvoyer qu'une seule ligne dans notre cas, et que les deux SELECT ne renvoient jamais tous les deux des résultats en même temps


---------------
Protèges carnets personnalisés & accessoires pour bébé
n°1853070
MagicBuzz
Posté le 19-02-2009 à 17:18:46  profilanswer
 

ah oui, si y'a tout le temps que deux ligne... :D

n°1853101
joce
Architecte / Développeur principal
"BugHunter"
Posté le 19-02-2009 à 18:04:28  profilanswer
 

MagicBuzz a écrit :

ah oui, si y'a tout le temps que deux ligne... :D


une seule en fait :D


---------------
Protèges carnets personnalisés & accessoires pour bébé
n°1853103
joce
Architecte / Développeur principal
"BugHunter"
Posté le 19-02-2009 à 18:05:58  profilanswer
 

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Remplacer OR par JOIN

 

Sujets relatifs
Remplacer texte entre deux balises html ?Remplacer une expression régulière par une autre
[ASP.NET & C#] Pagination : remplacer les numéros par "..."INNER JOIN sous Access2003
Cherche nouveau SGBD pour remplacer AccessRemplacer un mot par ce qui a été saisi en InputBox
[Resolu]Une ame charitable pour me remplacer "oleacc.h"Au click, remplacer un div par un autre
Problème d'encodage lors d'un join.[SQL Server] Remplacer le nom d'une table dans des procédures stockées
Plus de sujets relatifs à : Remplacer OR par JOIN


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR