iT邦幫忙

0

SQL JOIN ON 疑問

sql
  • 分享至 

  • xImage

各位好,我第一次使用這個平台發問,如果有需要改進的部分敬請指教:D

最近在自學SQL,找了網路上的50題做練習,在第15題時有一個疑問,不太懂怎麼解釋會比較好,爬了一些文也沒有找到ˊˇˋ

https://zhuanlan.zhihu.com/p/67645448 這個網址的第15題(15.按各科成绩进行排序,并显示排名, Score 重复时保留名次空缺)!

作者的程式碼:
select a.*,count(a.score) rank from sc a
left join sc b on a.cid = b.cid and a.score < b.score
group by a.cid,a.sid
order by a.cid,rank

我有疑問的是在 a.score < b.score 這邊
a跟b都是SC的表,不太懂這個部分要怎麼解釋,拿a表、b表的值比較的話,值不是一樣的嗎 @@

非常謝謝各位耐心地看完!!ヽ(✿゚▽゚)ノ

tenno081 iT邦研究生 4 級 ‧ 2021-07-19 10:02:20 檢舉
http://www.cxyzjd.com/article/liyang_nash/99641571
這篇有詳解
你可以再自行輸入做驗證
38han iT邦新手 5 級 ‧ 2021-07-19 10:50:54 檢舉
非常感謝您!!我找到的都沒分析這麼詳細 太謝謝你了:D
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

0
海綿寶寶
iT邦大神 1 級 ‧ 2021-07-19 10:04:38
最佳解答

a 跟 b 都是 sc
內容完全一樣
但是在 left join 之後
一切就不一樣了

以下是個不太好的說明
看過之後就可以忘掉
單純以 CId=02, score=80 為例

1.首先是原始資料

SId CId score
01 01 80
01 02 90
01 03 99
02 01 70
02 02 60
02 03 80
03 01 80
03 02 80
03 03 80
04 01 50
04 02 30
04 03 20
05 01 76
05 02 87
06 01 31
06 03 34
07 02 89
07 03 98

2.在 left join a.CId=b.CId 之後(以 CId=02 來看), 結果長這樣

SId CId score
01 02 90
02 02 60
03 02 80
04 02 30
05 02 87
07 02 89

3.再加上 a.score < b.score 之後(以 a.score=80 來看), 結果長這樣

SId CId score
01 02 90
03 02 80
05 02 87
07 02 89

4.這時就可以 select 出 count(a.score)=4

38han iT邦新手 5 級 ‧ 2021-07-19 10:51:50 檢舉

哇! 我有比較理解了 太謝謝您了! 不過我可以請問為什麼會說是不太好的說明呢@@

因為這是比較直白的解釋方式
比較好的說明
應該是要解釋何謂 self join 的基本定義

38han iT邦新手 5 級 ‧ 2021-07-19 10:58:27 檢舉

了解!! 謝謝您 ✪ ω ✪

0
一級屠豬士
iT邦大師 1 級 ‧ 2021-07-19 11:08:02
38han iT邦新手 5 級 ‧ 2021-07-19 11:11:47 檢舉

哇~這我還沒碰過耶! 感覺有點難,我來研究一下,謝謝您的建議唷!!(^^ゞ

我要發表回答

立即登入回答