2009-07-28 4 views
7

Récemment, je suis tombé sur le quiz suivant. Imaginons que nous ayons cette tableQuiz SQL intéressant

+--------+ 
| colors | 
+--------+ 
| red | 
| black | 
| white | 
| green | 
| orange | 
+--------+ 

La tâche consiste à écrire une requête SQL qui sélectionnera toutes les paires sans autoriser les doublons. Les permutations sont aussi comptées ({rouge, noir} = {noir, rouge}, donc une seule de la paire est autorisée).

+0

vous recherchez ANSI SQL ou peut-il être spécifique SGBD (ex SQL Server.)? –

+0

non, simplement ANSI – glaz666

Répondre

27

Essayez cette

Select A.Color, B.Color 
From Colors A 
Cross Join Colors B 
Where A.Color > B.Color 
+0

Noir = Noir serait faux, donc il serait sélectionné. La requête ci-dessus me semble bonne –

+0

Voici un lien intéressant sur CROSS JOINS http://www.databasejournal.com/sqletc/article.php/1438121/Generate-Test-Data-Quickly-with-Cross-Joins. htm –

+0

@glaz, car une jointure croisée signifie que chaque élément de l'ensemble A est associé à chaque élément de l'ensemble B ... Vous obtenez ainsi toutes les combinaisons possibles. Le prédicat de clause Where élimine simplement ceux où les paires d'éléments proviennent du même élément, et l'un des doublons ... (A, B) et (B, A) –

0
Select A.Colors, B.Colors From Colors A 
Cross Join Colors B Where A.Colors < B.Colors or B.colors < A.colors 
+3

Cela violerait la condition préalable relative aux permutations: '{ rouge, noir} = {noir, rouge}, donc seul un membre de la paire est autorisé'. –

0

essayez ceci:

Select * From colours A 
Cross Join colours B Where A.colours < B.colours or B.colours > A.colours 
and b.colours != b.colours and a.colours != a.colours