• 2

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

我寫了二種...
你可以試看看

1.
select distinct a.* from b
inner join a on a.學號 = b.FK_學號
where (b.科目 = '物理' and b.成績 > 15)
and (b.科目 = '會計' and b.成績 >= 30)


2.
with t (id,FK_學號,科目,成績) as (
select id,FK_學號,科目,成績
from b
where (b.科目 = '物理' and b.成績 > 15)
and (b.科目 = '會計' and b.成績 >= 30)
)
select distinct a.* from t
inner join a on a.學號 = b.FK_學號

zsd2 wrote:
試試...selec...(恕刪)


用zsd2 大的改成這樣可行嗎?
沒SQL可試...

select A.學號, A.姓名
from A, B
where (B.科目 = '物理' OR B.科目 = '會計')
and A.學號 = B.FK_學號
group by A.學號, A.姓名
having sum(B.成績)>=45
假設你的A叫學生,B叫成績:

select a.姓名, b.科目, b.成績, c.科目, c.成績
from 學生 a, 成績 b, 成績 c
where a.學號 = b.FK_學號 and a.學號 = c.FK_學號
and b.科目 = "物理" and b.成績 >= 15 and c.科目 = "會計" and c.成績 >= 30

以上我有寫資料去測,可以跑出想要的答案。
公喵不帥, 母喵不愛. 公喵愈壞, 母喵愈愛. 不帥的公喵想要母喵愛, 就只好學壞.
jjaammeess 大,
您寫的 SQL 指令執行無結果喔。
因為不會有同一筆資料的科目欄位同時等於 '物理' 及 '會計'


jjaammeess wrote:
我寫了二種...你可
(恕刪)...
where (b.科目 = '物理' and b.成績 > 15)
and (b.科目 = '會計' and b.成績 >= 30)
...(恕刪)
不想唸物理了...

lkyo wrote:
用zsd2 大的改成
(恕刪)...
group by A.學號, A.姓名
having sum(B.成績)>=45
...(恕刪)


lkye 大,您這樣的寫法會有副作用,因為您成績的條件是用加總,而不是個別判斷,
這樣可能會出現其他組合的情形。 例如有人 一科考 0 分, 一科考 45 分,加總符合 >=45
但卻不是所要的資料。
不想唸物理了...
我把目前手頭上的資料灌進去資料表, A 資料表約 20 萬筆資枓, B 資料表約 60 萬筆資料。

所有的 SQL 指令都在一秒內跑完。
排行如下。

第一名: 0.19 秒
-- fuyoke
SELECT *
FROM A
WHERE 學號 in (SELECT FK_學號 FROM B WHERE (科目='物理' AND 成績>=15) or (科目='會計' AND 成績>=30)
group by FK_學號 having count(FK_學號)=2)

◎我有修改 having count(FK_學號)>1 改為所設的條件數目 2。這樣可以加快 0.01 秒。

第二名:0.22 秒
-- zsd2
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.學號)=2

◎我有修改 having count(A.學號)>1 為 having count(A.學號)=2


第三名/第四名:0.29秒

-- sambad
select a.姓名, b1.科目, b1.成績, b2.科目, b2.成績
from a, b b1, b b2
where a.學號 = b1.FK_學號 and a.學號 = b2.FK_學號
and b1.科目 = '物理' and b1.成績 >= 15 and b2.科目 = '會計' and b2.成績 >= 30

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


感謝各位 SQL 達人的指導,效率比我自己想的提升達 34%。
不想唸物理了...
哇~
誤會一場 ..


換一種...

with t (FK_學號) as (
select FK_學號
from b
where (b.科目 = '物理' and b.成績 > 15)
or (b.科目 = '會計' and b.成績 >= 30)
group by FK_學號
having count(*) > 1
)
select distinct a.* from a
inner join t on t.FK_學號 = a.學號




with t (FK_學號) as (
select FK_學號
from b
where b.科目 in ('物理','會計')
group by FK_學號
having sum(case when b.科目 = '物理' and 成績>=15 then 1
when b.科目 = '會計' and 成績>=30 then 1
else 0 end) > 1
)
select distinct a.* from a
inner join t on t.FK_學號 = a.學號
我的寫法跟 zsd2 一樣
原來是第二名 ....
select from 後面接的table,果然是越少越好
  • 2
內文搜尋
X
評分
評分
複製連結
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?