2017-10-19 2 views
0

Je travaille avec une base de données SQL Oracle essayant d'imprimer toutes les combinaisons possibles de deux colonnes dans une table basée sur une troisième colonne.Retourne toutes les combinaisons de deux colonnes basées sur une troisième en sql

Pour plus d'explications. J'ai une table avec trois colonnes: ID, attribute1 et attribute2. Dites chacun que pour chaque ID, attribut1 peut être égal à 1, 2, 3 ou 4 et il en va de même pour attribut2. L'ID peut avoir plus d'une valeur de chaque attribut.

Actuellement, si ID = 1 a = 1,2 et attribute1 attribut2 = 3, 4 et 2 ID = a attribute1 = 1,2,3 et attribut2 = 1, 4, il peut être classé comme

ID attribute1 attribute2 
1 1    3 
1 2    4 
2 1    1 
2 2    1 
2 3    4 

ce que je voudrais est toutes les combinaisons de attribut1 et attribut2 pour chaque ID il ressemblerait à ceci:

ID attribute1 attribute2 
1 1    3 
1 1    4 
1 2    3 
1 2    4 
2 1    1 
2 1    4 
2 2    1 
2 2    4 
2 3    1 
2 3    4 
+0

alors êtes-vous encore sur 'Oracle' ou est-ce' SQL Server' maintenant? – Squirrel

+0

Eh bien, je suis assez nouveau pour les bases de données, mais j'utilise Oracle SQL Developer, je pense que cela signifie que c'est un serveur Oracle, non? –

+0

Oui, très probablement, mais vous avez tagué la question "sql-server", qui signifie "Microsoft SQL Server". Il devrait être étiqueté "oracle". –

Répondre

1

Cette requête renverra toutes les combinaisons entre les attributs 1 et attribut2 pour chaque ID:

SELECT A1.ID, attribute1, attribute2 
    FROM (SELECT DISTINCT ID, Attribute1 FROM MyTable) A1 
    INNER JOIN (SELECT DISTINCT ID, Attribute2 FROM MyTable) A2 ON A1.ID = A2.ID 
+0

Merci pour la réponse, mais quand je cours cela, je reçois l'erreur "FROM mot-clé introuvable où prévu", des idées? –

+0

J'ai oublié de spécifier 'FROM Table' à l'intérieur des sous-requêtes, maintenant je l'ai modifié. –

0

Quelque chose comme ça devrait le faire:

SELECT t1.id, t1.attribute1, t2.attribute2 
FROM MyTable t1 
JOIN MyTable t2 
    ON t1.id = t2.id 
    AND t1.attribute1 = t2.attribute1 
UNION ALL 
SELECT t1.id, t1.attribute1, t2.attribute2 
FROM MyTable t1 
JOIN MyTable t2 
    ON t1.id = t2.id 
    AND t1.attribute2 = t2.attribute2 

Si vous ne souhaitez pas de doublons, remplacez UNION ALL par UNION.

Je pense que vous pouvez le faire de cette façon, aussi, ce qui pourrait être mieux, mais pourrait de moins bons résultats:

SELECT t1.id, t1.attribute1, t2.attribute2 
FROM MyTable t1 
JOIN MyTable t2 
    ON t1.id = t2.id 
    AND (t1.attribute1 = t2.attribute1 OR t1.attribute2 = t2.attribute2) 
+0

Merci pour la réponse, mais est-ce que cela signifie que je dois d'abord créer une deuxième table appelée t2? –

+1

@Tom Axelsson: t1 et t2 sont des alias. La table est la même - MyTable - que vous devez remplacer par votre vrai nom de table. –