如下圖所示,
因為每個人所修科目不同,所以拆成兩個資料表 A & B 並進行關連。

SQL 雙資料表關連 多條件 指令請教

所要達到的查詢結果是,要找出有修過那些科目且成績達到多少以上的學生名字。

如,物理 成績>=15 且 會計成績>=30 的學生。

我想到的方法是這樣

SELECT *
FROM A
WHERE EXISTS (SELECT ID FROM B WHERE A.學號=B.FK_學號 AND B.科目='物理' AND 成績>=15)
AND EXISTS (SELECT ID FROM B WHERE A.學號=B.FK_學號 AND B.科目='會計' AND 成績>=30)

這樣看起來似乎會很沒效率。因為實際的資料表 A 約有10萬筆,資料表B 約50萬筆。
想請教各位專家是否有最佳化的寫法?

謝謝大家。

SQL 雙資料表關連 多條件 指令請教

wenwenwen wrote:
如下圖所示,因為每個...(恕刪)


好久沒使用了....
不知我的記憶是不是可行

select 姓名
from A
where
(select 學號 from B where 科目=物理 and 成績>=15)=(select 學號 from B where 科目=會計 and 成績>=30)
試試...

select A.學號, A.姓名
from A, B
where ((B.科目 = '物理' and B.成績 >= 15) OR (B.科目 = '會計' and B.成績 >= 30))
and A.學號 = B.FK_學號
group by A.學號, A.姓名
having count(A.學號)>1

lkyo wrote:
好久沒使用了....
select 姓名
from A
where
(select 學號 from B where 科目=物理 and 成績>=15)=(select 學號 from B where 科目=會計 and 成績>=30)
...(恕刪)


結果有下列的錯誤訊息。

子查詢傳回不只 1 個值。這種狀況在子查詢之後有 =、!=、<、<=、>、>= 或是子查詢作為運算式使用時是不允許的。
不想唸物理了...
zsd2 wrote:
試試...
select A.學號, A.姓名
from A, B
where ((B.科目 = '物理' and B.成績 >= 15) OR (B.科目 = '會計' and B.成績 >= 30))
and A.學號 = B.FK_學號
group by A.學號, A.姓名
having count(A.學號)>1

...(恕刪)


太棒了,試過可用,只要兩次 Table Scan,
比我的要三次 Table Scan 的SQL指令少了一次。

效率我想至少增加 33%。因為我的指令要跑兩次大資料表 B。

謝謝您。

不想唸物理了...
樓主想請教您一下
您是使用甚麼查詢工具有SQL語法的效率分析?

不是很了解SQL
修改樓上大大的語法
改用in效率是否會差很多?

SELECT *
FROM A
WHERE 學號 in (SELECT FK_學號 FROM B WHERE (科目='物理' AND 成績>=15) or (科目='會計' AND 成績>=30) group by FK_學號 having count(FK_學號)>1)
可以用SQL Management Studio附帶的Include Actual Execution Plan.

fuyoke wrote:
樓主想請教您一下
您...(恕刪)

fuyoke wrote:
(恕刪)...
SELECT *
FROM A
WHERE 學號 in (SELECT FK_學號 FROM B WHERE (科目='物理' AND 成績>=15) or (科目='會計' AND 成績>=30) group by FK_學號 having count(FK_學號)>1)
...(恕刪)


感覺上效率應跟 zsd2 大的 SQL 指令差不多,都是兩次 Table Scan。

目前設計的資料庫尚未灌入實際資料,程式還沒寫完。
待灌入後實測再回報上來。
不想唸物理了...
是sql server嗎???
可以試試看用他的UI拉出來你要的結果
看看效能會不會比較好

另外如果要效能
可以建立索引
電腦工程師,有問題可以找我討論 Raxel

轉一轉 舔一舔 泡一泡 wrote:
可以用SQL Man...(恕刪)


太好了!
感謝大大的指導~
文章分享
評分
評分
複製連結

今日熱門文章 網友點擊推薦!