2010-05-19 6 views
2

Ok, donc le problème auquel je suis confronté est ceci, j'ai une table avec 3 colonnes: ID, Key et Value.SQL: joindre dans la même table avec une autre clause 'where'

ID | Key | Value 
================ 
1 | 1 | ab 
1 | 2 | cd 
1 | 3 | ef 
2 | 1 | gh 
2 | 2 | ij 
2 | 3 | kl 

Maintenant, je veux sélectionner la valeur des touches 1 & 3 pour tous les ID, le retour doit être comme ça

ID | 1 | 2 
================ 
1 | ab | ef 
2 | gh | kl 

Ainsi par ID 1 ligne contenant les valeurs des touches 1 & 3.

J'ai essayé d'utiliser « rejoindre », mais depuis que je dois utiliser plusieurs clauses où je ne peux pas comprendre comment obtenir ce travail ..

+0

Pourquoi l'ID n'est-elle pas unique? est-ce une table de relation? – mga

+0

L'ID est une clé étrangère à une table différente – Pmarcoen

+0

Ce que vous voulez probablement est souvent appelé un tableau croisé dynamique. Mais la mise en œuvre dépend du serveur de base de données que vous utilisez (parce que la réponse est souvent procédurale, pas seulement une seule sélection). –

Répondre

4

Pour Oracle 8i +, utilisez:

SELECT t.id, 
     MAX(CASE WHEN t.key = 1 THEN t.value ELSE NULL END) AS "1", 
     MAX(CASE WHEN t.key = 2 THEN t.value ELSE NULL END) AS "2" 
    FROM TABLE t 
GROUP BY t.id 

Pour les versions antérieures d'Oracle, remplacez le CASE pour DECODE syntax. Oracle n'a pas ajouté la syntaxe PIVOT jusqu'à 11g.

+0

@Vincent Malgrat: Thx, ne savait pas CAS a été soutenu que tôt. –

+0

hmm continuer à obtenir une erreur 'parenthèse gauche manquante' en utilisant ce code. Il ne semble rien manquer cependant .. – Pmarcoen

+0

@Pmarcoen: Vérifiez la fonction d'agrégat - assurez-vous que l'instruction CASE est entièrement à l'intérieur. –

0

Pourquoi pas vous venez de faire trois requêtes? Si je vous comprends bien, vous allez devoir utiliser une jointure syndicale.

0
SELECT ID, VALUE AS v1, S.v2 
FROM TABLE 
WHERE KEY = 1 
JOIN (SELECT ID, VALUE AS v2 FROM TABLE WHERE Key =3) AS S ON TABLE.ID = S.ID 

Si vous avez besoin de plus, ajouter une jointure pour chaque où ...

1

Sans l'aide de requêtes pivot, vous pouvez également se joindre à une sous-requête, comme suit:

SELECT  t.id, MAX(key_1.value) AS '1', MAX(key_3.value) AS '2' 
FROM  tb t 
INNER JOIN (SELECT id, value FROM tb WHERE `key` = 1) key_1 ON (key_1.id = t.id) 
INNER JOIN (SELECT id, value FROM tb WHERE `key` = 3) key_3 ON (key_3.id = t.id) 
GROUP BY t.id; 

Test Case (dans MySQL):

CREATE TABLE tb (`id` int, `key` int, `value` char(2)); 
INSERT INTO tb VALUES (1, 1, 'ab'); 
INSERT INTO tb VALUES (1, 2, 'cd'); 
INSERT INTO tb VALUES (1, 3, 'ef'); 
INSERT INTO tb VALUES (2, 1, 'gh'); 
INSERT INTO tb VALUES (2, 2, 'ij'); 
INSERT INTO tb VALUES (2, 3, 'kl'); 

Résultat:

+------+------+------+ 
| id | 1 | 2 | 
+------+------+------+ 
| 1 | ab | ef | 
| 2 | gh | kl | 
+------+------+------+ 
2 rows in set (0.04 sec) 
+0

a fait l'affaire, thx mate! – Pmarcoen