“子查詢返回的值不止一個。當子查詢跟隨在 =、!=、<、<=、>、>= 之後,或子查詢用作表示式時,這種情況是不允許的。”SQL查詢錯誤解析
為了實現下述程式碼,首先得有資料庫和相應的表格,本文用的是https://blog.csdn.net/qaz13177_58_/article/details/5575711/中的案例,即先用連線中那些命令建立資料庫、生成資料表,然後就有了student,teacher,course,score等表。
最近用select做題,經常碰到下面的這個錯誤:
子查詢返回的值不止一個。當子查詢跟隨在 =、!=、<、<=、>、>= 之後,或子查詢用作表示式時,這種情況是不允許的。
比如針對下述問題:
1.查詢成績比該課程平均成績低的同學的成績表。
我的查詢:select * from score where degree<(select avg(degree) from score group by cno),執行後,出現上述錯誤。
正確查詢:SELECT A.* FROM SCORE A WHERE DEGREE<(SELECT AVG(DEGREE) FROM SCORE B WHERE A.CNO=B.CNO)
2.查詢出“計算機系“教師所教課程的成績表。
我的查詢:select * from score where cno=
(select course.cno from course where tno=(select tno from TEACHER where teacher.depart='計算機系')),執行後,出現上述錯誤。
正確查詢:select * from score where cno IN
(select course.cno from course INNER JOIN TEACHER ON TEACHER.TNO=COURSE.TNO AND teacher.depart='計算機系')
上述問題2在於用了'='於select子查詢(我的查詢的第二行括號內語句)之前,但是select子查詢返回的不止一個元素,所以出錯了。
如果問題改一改,變為:查詢出“李誠“教師所教課程的成績表。那麼我們可以用'='構成的巢狀查詢語句如下:
select * from score where cno=
(select course.cno from course where tno=(select tno from TEACHER where teacher.depart='李誠'))
為什麼這時候可以執行而且得到想要的結果了?這是因為select tno from TEACHER where teacher.depart='李誠'只返回'804'這個tno值,而且select course.cno from course where tno='804'也只返回'3-245'這個cno值,第二行中的兩個巢狀子查詢都只返回一個值,因此上述語句中的兩個'='不會出錯。