2011-05-07 23 views
7

Oracle'ın n alanlarının benzersiz birleşimlerini sorgulamak için basit bir yolu var mı. 1,2 ve 2,1 aynı kabul edilir bu sorgu itibarenSQL ve benzersiz n-coulmn kombinasyonları

SELECT LEAST(x.a, x.b), 
     GREATEST(x.a,x.b) 
    FROM (SELECT c1.n a, 
       c2.n b 
      FROM combinations c1 
    CROSS JOIN combinations c2 
     WHERE c1.n <> c2.n) x 
GROUP BY LEAST(x.a, x.b), GREATEST(x.a,x.b); 

:

CREATE TABLE combinations AS 
SELECT 1 AS n 
    FROM DUAL 
UNION ALL 
SELECT 2 
    FROM DUAL; 

eşsiz kombinasyonlar için sorgulama: Çok basit iki saha çözümü var. Ne yazık ki, 3-alanlı yapı için çalışmaz (örneğin, 1,2,3'ün, değerlerin sıralanması önemli olmadığı için, 3,1,2 ile aynı olduğu düşünülmelidir). Oracle analitik fonksiyonları bu soru için uygun bir çözüm sağlıyor mu? Belirli bir Oracle analitik işlevini önerebilir misiniz?

+1

Sadece <<'yerine' <'kullanarak katılmaya gerek yok mu? –

cevap

6

2 sütunlar için Sorgunuz böyle yazılabilirdi: o zaman gerekir

SELECT 
    c1.n, 
    c2.n 
FROM combinations c1 
    INNER JOIN combinations c2 ON c1.n < c2.n 

3 için sütunları bazı eklemeler yapmak (kalın vurgulanmış):

SELECT 
    c1.n, 
    c2.n, c3.n 
FROM combinations c1 
    INNER JOIN combinations c2 ON c1.n < c2.n 
    INNER JOIN combinations c3 ON c2.n < c3.n 

Artık daha fazla sütun için bunu nasıl ölçekleyeceğinizi kolayca tahmin edebileceğinizden eminim.

0

Çözümünüzü, kombinasyonlarınızı döndürmek için pipelined table function kullanıyorsunuzdur.

İşleviniz, gereksinim duyduğunuz verileri istediğiniz sırayla döndüren kendi paketinde (paket durumuyla) yaşayabilir. Durum, geri dönecek olan sütunların sayısı ile belirlenen başlangıç ​​değişkenleri olacaktır (başlangıç ​​= başlangıç ​​değerlerine (A = 1, B = A + 1, C = B + 1, D = C + 1, vs.). Sonra sadece

PIPE ROW(a,b,c,d); 
-- increment D 
-- if D overflow limit, increment C and re-init D to C+1 
-- if C overflow limit-1, increment B and re-init C to B+1 
-- if B overflow limit-2, increment A and re-init B to A+1 
-- if A overflow limit-3, the end 

Bu çıkışlar, N = 6

1,2,3,4 
1,2,3,5 
1,2,3,6 
1,2,4,5 
1,2,4,6 
1,3,4,5 
1,3,4,6 
2,3,4,5 
2,3,4,6 
2,3,5,6 
3,4,5,6 
İlgili konular