MYSQL : Jointure externe excluant les id présents dans un table

MYSQL : Jointure externe excluant les id présents dans un table - SQL/NoSQL - Programmation

Marsh Posté le 22-07-2009 à 10:31:49    

Bonjour,
 
N'étant pas trop fort voir assez faible en jointure externe,
je me demandais s'il était possible de passer par ce mécanisme pour faire l'équivalent de la requête suivante :
SELECT pa_id, pa_libel
FROM an_partenaire
WHERE pa_id not in ( SELECT po_pa_id FROM an_partenaire_autorise WHERE po_f_id = %s )
order by pa_libel ;
 
J'ai essayé cela mais du coup pas de clause sur le po_f_id (mais cela marche) :
SELECT pa_id, pa_libel
FROM an_partenaire
left join an_partenaire_autorise on pa_id = po_pa_id
WHERE po_pa_id is null
order by pa_libel ;
 
En essayant d'inclure la clause sur le po_f_id, la requête ne marche plus et ne me renvoie rien :
SELECT pa_id, pa_libel
FROM an_partenaire
left join an_partenaire_autorise on pa_id = po_pa_id
WHERE po_pa_id is null and po_f_id = %s
order by pa_libel ;
 
Est il possible de passer par une jointure externe pour remplacer ma requête imbriquée?
Est-ce que les jointures externes sont plus performantes en terme de ressources processeurs ? de ressources mémoires ?
 
Merci
A+

Reply

Marsh Posté le 22-07-2009 à 10:31:49   

Reply

Marsh Posté le 22-07-2009 à 10:40:07    

Code :
  1. SELECT pa_id, pa_libel
  2. FROM an_partenaire INNER JOIN an_partenaire_autorise ON pa_id != po_pa_id
  3. WHERE po_f_if = %s
  4. ORDER BY pa_libel

Message cité 1 fois
Message édité par Harkonnen le 22-07-2009 à 10:42:07

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 22-07-2009 à 11:04:24    

Harkonnen a écrit :

Code :
  1. SELECT pa_id, pa_libel
  2. FROM an_partenaire INNER JOIN an_partenaire_autorise ON pa_id != po_pa_id
  3. WHERE po_f_if = %s
  4. ORDER BY pa_libel


 

T'es sûr de toi là, ça me parait louche? [:autobot]
Je fais plutôt comme ça d'habitude, perso - en tout cas je trouve ça plus clair [:joce] :

 
Code :
  1. SELECT pa_id, pa_libel
  2. FROM an_partenaire LEFT OUTER JOIN an_partenaire_autorise ON (pa_id = po_pa_id AND po_f_if = %s)
  3. WHERE po_pa_id IS NULL
  4. ORDER BY pa_libel

Message cité 1 fois
Message édité par skeye le 22-07-2009 à 11:05:18

---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 22-07-2009 à 11:10:59    

skeye a écrit :


 
T'es sûr de toi là, ça me parait louche? [:autobot]


J'ai un peu lu le 1er post en biais, il est effectivement possible que je me sois loupé :D
Mais ça vaudrait le coup d'être testé quand même, ça ne me parait pas si idiot que ça [:jean-guitou]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 22-07-2009 à 11:12:18    

Harkonnen a écrit :


J'ai un peu lu le 1er post en biais, il est effectivement possible que je me sois loupé :D
Mais ça vaudrait le coup d'être testé quand même, ça ne me parait pas si idiot que ça [:jean-guitou]


 
Ta jointure sur une inégalité va pas lui retourner un quasi produit cartésien?[:autobot]


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 22-07-2009 à 11:45:24    

Salut
 
Merci pour vos réponses rapides.
Alors la 1er "solution" proposer par le tueur d'Atréides ( Harkonnen ) ne marchait pas.
 
Celle proposer par skeye marche ( après modification de 'po_f_if' en 'po_f_id' )
J'ai bien des valeurs retournées. La table an_partenaire_autorise est vide à leur actuelle donc je reviendrai conclure après le peuplement de cette dernière.
 
Sinon, laquelle de ces deux requêtes vous semble la plus performante ?
 
Merci a+

Reply

Marsh Posté le 22-07-2009 à 11:50:34    

scalapb a écrit :

Sinon, laquelle de ces deux requêtes vous semble la plus performante ?


Lesquelles? La tienne et la mienne, ou celle qui marche pas et la mienne? :D


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 22-07-2009 à 13:35:45    

tu prends celle de skeye et tu fous un index sur les critères de jointure :o

 


En tout cas niveau performances je suis pas sûr de celle d'harko [:joce]


Message édité par tet2neu le 22-07-2009 à 13:36:51
Reply

Marsh Posté le 22-07-2009 à 14:22:38    

Au niveau des performances je parlais des requêtes fonctionnelles, donc de la mienne et de celle de skeye.
po_pa_id et po_f_id étaient déjà indexé car je savais de base qu'ils pouvaient servir
critères de jointure ou de liaison.
 
Mais on pouvais également étendre la question au cas générale et sans notion du SGBD utilisé :
Une requête imbriquée est elle plus performante qu'une requête avec jointure externe ?
 
En tout cas, grand merci
a+

Reply

Marsh Posté le 22-07-2009 à 14:24:33    

En général la jointure est censée être plus performante...:D


---------------
Can't buy what I want because it's free -
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed