J'ai ci-dessous le tableau: Test

create table test (Id char)

insert into test values
('A'),
('B'),
('C'),
('D'),
('E')

Lien Fiddle pour les tests

Production attendue:

  1. a.ID b.ID
  • UN B
  • A C
  • UN D
  • A E
  • AVANT JC
  • B D
  • ÊTRE
  • C D
  • C E
  • D E

J'ai essayé le code ci-dessous:

select a.id, b.id from test a cross join test b where a.id<>b.id

Mais ma sortie actuelle a une combinaison invalide qui est déjà présente ci-dessus, voir l'image ici (les enregistrements en surbrillance ne sont pas valides car ils sont présents ci-dessus dans l'ordre inverse)

0
bzflag 20 oct. 2020 à 13:25

2 réponses

Meilleure réponse

Devrait être assez simple; passer de <> à <:

select a.id, b.id from test a cross join test b where a.id < b.id
3
Littlefoot 20 oct. 2020 à 10:27

Utilisez une requête hiérarchique pour éviter une auto-jointure:

SELECT id, PRIOR id AS id2
FROM   test
WHERE  LEVEL = 2
CONNECT BY NOCYCLE PRIOR id > id
ORDER BY id, id2

Quelles sorties:

ID | ID2
:- | :--
A  | B  
A  | C  
A  | D  
A  | E  
B  | C  
B  | D  
B  | E  
C  | D  
C  | E  
D  | E  

db <> fiddle ici

1
MT0 20 oct. 2020 à 11:09