1. 程式人生 > >sql 如何避免出現笛卡爾積運算

sql 如何避免出現笛卡爾積運算

如何避免出現笛卡爾積運算.

如何避免出現笛卡爾積運算.
  兩表關聯的時候通過最小的粒度關聯
SQL>create volatile MULTISET TABLE   tb_test_01
(
statis_month number(6)
,area_code varchar2(5)
)
;
insert into tb_test_01 values(200902,'A2101');
insert into tb_test_01 values(200902,'A2102');


SQL>create volatile MULTISET TABLE   tb_test_02
(
statis_month number(6)
,area_code varchar2(5)
)
;
insert into tb_test_02 values(200902,'A2101');
insert into tb_test_02 values(200902,'A2102');
 
測試1:表tb_test_01和tb_test_02的最小粒度是area_code,這裡我們使用statis_month關聯兩表
看出來的記錄數是多少.
select a.statis_month,a.area_code
from tb_test_01 a
inner join tb_test_02 b
on a.statis_month = b.statis_month
;
200902 A2101
200902 A2102
200902 A2101
200902 A2102
這裡輸出的記錄數是2(表tb_test_01的兩條記錄) X 2(表tb_test_2的兩條記錄) = 4,產生了笛卡爾積運算,顯然這不是我們想要的結果.

測試2:通過最小粒度area_code關聯

select a.statis_month,a.area_code
from tb_test_01 a
inner join tb_test_02 b
on a.area_code = b.area_code
;
STATIS_MONTH AREA_CODE
------------ ---------
200902 A2101
200902 A2102
這裡通過最小的粒度關聯,達到我們想要的結果.
總結:在實際應用過程中通過關聯表的最小粒度關聯,可以避免產生笛卡爾積.這裡的最小粒度可以理解為表中的唯一性約束的欄位值.