2009-09-23 12 views
0

je ne me rappelle pas comment se joindre à une table pour lui-même .. ma table est:jointure gauche sur la même table

| id | proc | value | kind | 
| 1 | 1 | foo | a | 
| 2 | 1 | bar | b | 
| 3 | 2 | some | a | 

et je dois récupérer la valeur col où proc est proc $ et est à la fois «genre a » et 'b' .. Eh bien, je dois faire ont que (la recherche de proc = 1):

| v_a | v_b | 
| foo | bar | 

J'ai donc écrit cette requête:

SELECT 
    a.value AS v_a, 
    b.value AS v_b 
FROM 
    (SELECT value FROM table WHERE proc = '1' AND kind = 'a') AS a, 
    (SELECT value FROM table WHERE proc = '1' AND kind = 'b') AS b 

et de travaux mais ly si dans la table j'ai les deux lignes pour kind = a et kind = b.

Mais j'ai besoin que si manquez une ligne, je vais avoir une valeur nulle: si je cherche proc = 2 je dois obtenir:

| v_a | v_b | 
| foo | NULL| 

Au lieu de cela, avec ma requête je ne s'anythong si la b ou une ligne est manquante.

Je travaille avec mysql ... Comment faire ça?

Edit: Je pourrais utiliser la clause UNION, mais cela me permettra pas d'avoir une valeur NULL quand une ligne est manquante (type = a ou type = b)

Répondre

1

que vous devez faire une jointure complète en cas proc existe pour « un » mais pas pour « b » ou vice versa:

SELECT 
    a.value v_a, 
    b.value v_b 
FROM (SELECT proc, value FROM tab WHERE kind = 'a') a LEFT JOIN 
(SELECT proc, value FROM tab WHERE kind = 'b') b 
    ON a.proc = b.proc 
WHERE a.proc = '1' 
UNION 
SELECT 
    a.value v_a, 
    b.value v_b 
FROM (SELECT proc, value FROM tab WHERE kind = 'b') b LEFT JOIN 
(SELECT proc, value FROM tab WHERE kind = 'a') a 
    ON a.proc = b.proc 
WHERE b.proc = '1' 

EDIT : 1er a donné requête MS SQL Server (FULL JOIN) mais apparemment il est pas pris en charge par MYSQL, donc je l'ai changé à une union de 2 LEFT JOIN

+0

Idéologiquement, c'est ce dont j'ai besoin, mais je reçois l'erreur près de la jointure complète .. est-ce que mysql supporte la jointure complète? – Strae

+0

J'ai modifié la requête à UNION de 2 LEFT JOIN. – manji

+0

Et nous avons un gagnant! Ça marche. Mais sa complexité ressemble à une alerte de mauvaise conception de mes tables db, je vais vérifier à nouveau ma structure s'il y a un moyen plus simple et plus rapide .. merci l'homme! – Strae

0

select * from t1 full outer join t2 on some_id = some_other_id?

+0

doesnt work .... – Strae

1

J'ai raté votre besoin d'extraire les valeurs NULL. Ceci est compliqué, mais il semble fonctionner:

SELECT 
    a.value AS a_val, 
    (SELECT value FROM t b2 WHERE b2.proc = a.proc AND b2.id != a.id) AS b_val 
FROM `t` a 
WHERE a.kind = 'a' 

UNION DISTINCT 

SELECT 
    (SELECT value FROM t a2 WHERE a2.proc = b.proc AND a2.id != b.id) AS a_val, 
    b.value AS b_val 
FROM `t` b 
WHERE b.kind = 'b' 
+0

Cette solution fonctionne aussi, merci ! – Strae

0
SELECT 
    a.value AS v_a, 
    b.value AS v_b 
FROM 
    (SELECT proc, value FROM table WHERE proc = '1' AND kind = 'a') AS a 
LEFT OUTER JOIN 
    (SELECT proc, value FROM table WHERE proc = '1' AND kind = 'b') AS b 
ON a.proc=b.proc 
Questions connexes