你可以試看看
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_學號
您寫的 SQL 指令執行無結果喔。
因為不會有同一筆資料的科目欄位同時等於 '物理' 及 '會計'
jjaammeess wrote:
我寫了二種...你可
(恕刪)...
where (b.科目 = '物理' and b.成績 > 15)
and (b.科目 = '會計' and b.成績 >= 30)
...(恕刪)
不想唸物理了...
所有的 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.學號
內文搜尋
X




























































































