當前位置:首頁 » 編程語言 » 資料庫sql笛卡爾乘積
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

資料庫sql笛卡爾乘積

發布時間: 2023-06-27 21:23:38

sql語句查詢出現笛卡爾怎麼辦

兩表連接如果要避免返回笛卡爾積,必須確保至少一方表是唯一的,否則在能查到記錄的情況下,不論哪一種連接方式一定會返回笛卡爾積記錄集的。
我們可以利用主鍵、唯一索引、distinct關鍵字和分組等手段來確保連接是一對多或一對一的,這樣就可以防止笛卡爾積發生。具體的實現方法要根據數據結構和查詢要求才能給出,可以說是千變萬化的,需要具體問題具體分析解決。

㈡ SQL中笛卡爾積有什麼用

某些情況下,用於 尋找連續日期中殘缺的數據 的時候,可以先笛卡爾積做一個排列組合。然後和目標表進行關聯,查找哪些數據缺少了。

例如有個考勤記錄表,記錄著100個人的2011年4月的考勤信息,理論上這些人應該每天都有記錄的。
但是實際上某些人在某些天上面的數據,缺少了。
一天一天的查詢,還是一個人一個人的查詢,都有些麻煩。
這種情況下,可以針對 每個人 與 每一天 做一個 笛卡爾積 的處理。
然後與實際的表去關聯。就很容易查詢出結果了。

㈢ 在SQL-SERVER2000中對同一個資料庫多張表進行查詢時怎樣避免笛卡兒乘積

在寫join類型的語句的時候,最好使用join來代替直接用「,」分隔多個表。這樣必須提供on條件才能進行查詢。當然,join的條件一定要設置好,否則也會出現笛卡爾積的。

比如tableA和TableB向關聯的是ID欄位

如果用「,「分隔兩個表的話語據應該如下

select count(*)
from tableA ,TableB
where TableA.id=TableB.id

如果把where 語句漏掉就出現笛卡爾積了
select count(*)
from tableA ,TableB

同樣,寫成join的話,如果不指定on里的條件的話,語法是錯的
select count(*)
from TableA join TableB
on TableA.id=TableB.id

但是如果再on里指定了一個錯誤的關聯條件的話,也是會出現笛卡爾積的,比如:
select count(*)
from TableA join TableB
on 1=1

當然一般人不會閑得去把on條件設置成1=1,不過這是舉個例子,就是為了說明on的篩選條件一定要設置好。

㈣ SQL語言如何把A表的一列與B表建立笛卡爾乘積

使用交叉連接產生笛卡爾乘積
select * from A cross join B

或不使用任何連接條件,也可產生笛卡爾乘積
select * from A,B

笛卡爾乘積與列無關,如果你想顯示某幾列,就在select後面指定相應的列名即可.

補充:
用A表的某列與B表做笛卡爾積,道理是一樣的,你可以把該列看做是一個表源.如:
select * from
(select distinct 某列 from A) C cross join B

㈤ sql 有關笛卡爾積的問題

我測試建了幾個表,你自己對照改成你得表名列名就行了
create table student
(
sid int identity primary key,
name nvarchar(50)
)
insert into student
select 'aaa' union
select 'bbb' union
select 'ccc'
go
create table F
(
fid int identity primary key,
fname nvarchar(50)
)
go
insert into F
select '數學' union
select '語文' union
select '英語'
go
create table Score
(
cid int identity primary key,
sid int,
fid int,
score int
)
go
insert into score
select 1,1,60 union
select 1,2,70 union
select 1,3,80 union
select 2,1,90
go
select * from student
select * from f
select * from score
go
select s.sid,f.fid,s.name,fname
from student s
cross join score c
cross join f
where
not exists
(
select cid from score where s.sid=score.sid and f.fid=score.fid
)
group by s.sid,s.name,fname,f.fid
order by sid

㈥ 資料庫笛卡爾積

所謂笛卡爾積,通俗點說就是指包含兩個集合中任意取出兩個元素構成的組合的集合.

㈦ sql 笛卡爾積問題

select * from b bb where bb.id not in (select * from a,b where a.id=b.id);
思路:
寫個子查詢 把a和b中都有的數據查出來(select * from a,b where a.id=b.id) 然後排除
多看看查詢以及關聯查詢 子查詢的原理 就明白了

㈧ sql關聯出現笛卡爾積現象怎樣避免

d與s沒有產生關聯,按照道理d與s會產生笛卡爾積但是你的查詢結果並沒有,這是因為完全用where條件來限制除了本身在實現你這個sql的時候,sql引擎有很多演算法1種是產生3個表的笛卡爾積,按照where來過濾。產生結果2、按照e和d來連接,產生結果,在於s來3、按照d和s產生笛卡爾積,在按照e和s來過濾等等本身你看到的只是一個運算結果。運算過程你並沒有看到,也就是sql引擎實際選擇使用哪種方法。所以不是說它沒有產生笛卡爾積,而是說它有可能產生,也有可能沒有產生,根據它的演算法自己決定。如果你想看到它到底有沒有選擇笛卡爾積的演算法,那麼就看看這個sql的實際執行計劃就知道了。

㈨ 寫sql語句 一般什麼時候出現笛卡爾積如何避免

樓主這個問題,表達的不是很准確。事實上你所說的什麼時候出現笛卡爾積,應該是指一對多關系的時候,如果避免重復,而不是如何避免笛卡爾積。笛卡爾積在SQL中是有特殊的關聯來求笛卡爾積的,求笛卡爾積的指令是crossjoin。那麼回到如何避免重復的問題上,一般對於SQL開發來說,這是讓很多人頭疼的問題。一般呢,我個人把重復定義為如下三種情況:x0dx0a第一種,原數據重復,指的是對應關系表中的數據本身就存在重復。但這種情況並不多,開發的時候會設定主鍵,一般情況較少。這種情況通常把需要使用的粒度數據distinct後,再關聯就可以了。x0dx0a第二種,就是維度重復。比如有區域表,分別是省市縣三列,而你要統計的是到省的數據,這樣你直接寫join的時液茄候會直接關聯出很多條,這樣通常鬧皮察使用子查詢去除維度重復後,再關聯即可x0dx0a第三種,就是在一對多關系關聯出來後的數據維度重復。有些東西是存放很多關系表握輪的,在關系表關聯後出現重復數據是個很正常的事情,但是可能由於需求比較特別,這樣我們通常對這些數據進行排序組合,匯總後取數的原則,來選出我們需要的數據。x0dx0a當然,說了這么多,其實怎麼寫一段SQL,還是要看需求和數據結構。具體的數據結構和具體的需求,定位了一段SQL該怎麼寫。多實踐,你就會感悟到了