2015-05-29 61 views
3

我該如何解決這個問題? 我需要消除重複的笛卡爾產品,它自己的表。 我想用「連接」。謝謝。oracle sql創建組合同表無重複

create table foo (
num number(2) 
); 

insert into foo values (1); 
insert into foo values (2); 
insert into foo values (3); 

select a.num,b.num 
from foo a, foo b; 

NUM NUM 
--- --- 
1 1 
1 2 
1 3 
2 1 * duplicated 
2 2 
2 3 
3 1 * duplicated 
3 2 * duplicated 
3 3 

回答

2

你可以試試這個:

select a.num,b.num 
    from foo a cross join foo b 
where a.num <= b.num 
1
select a.num,b.num 
from foo a, foo b 
where a.num = b.num 
+2

停止促進逗號分隔加入! –

+0

雖然這篇文章可能會回答這個問題,但添加一些解釋以及可能的相關文檔的鏈接仍然是一個好主意。具有良好解釋和參考的答案通常對當前OP和未來訪問者都更有用。詳盡的答案也更有可能吸引積極的選票。 –

1

SQL Fiddle

的Oracle 11g R2架構設置

create table foo (num) AS 
SELECT LEVEL FROM DUAL CONNECT BY LEVEL <= 3; 

查詢1

select a.num,b.num 
from foo a CROSS JOIN foo b 
WHERE a.num <= b.num 

Results

| NUM | NUM | 
|-----|-----| 
| 1 | 1 | 
| 1 | 2 | 
| 1 | 3 | 
| 2 | 2 | 
| 2 | 3 | 
| 3 | 3 | 
1

沒有必要的交叉連接,因爲你正在做一個連接,你想從的第二個實例相匹配的行表的數量與表中第一個實例的數量相同或更多。這就是你如何防止「重複」條目:

with foo as (SELECT LEVEL num FROM DUAL CONNECT BY LEVEL <= 3) 
select f1.num f1_num, 
     f2.num f2_num 
from foo f1 
     join foo f2 on (f1.num <= f2.num); 

    F1_NUM  F2_NUM 
---------- ---------- 
     1   1 
     1   2 
     1   3 
     2   2 
     2   3 
     3   3