SQL語句對於多表聯合查詢重複欄位的特殊語法處理
SELECT m.*,d_name,r_name,m2.m_account as shangji_account FROM Member m,Member m2,Role r,Depart d WHERE m.m_rid=r.id and m.m_did=d.id and m.m_shangji=m2.id ORDER BY m.id DESC
通常情況下面我們一般每個表裡都有個id自動增長的欄位。而我們需要用到m這張表的所有內容,只是它有部分欄位關聯到的其他表的id需要還原為對應的列,也就是外鏈了。
如果聯合查詢的話對於結果獲取是很麻煩的。這時的一個辦法就是把要用到的資料一個個都在select後面用別名列出來。不過這樣很麻煩,今天發現一個很好的辦法,就是用上面的。m.*表示取m表的所有欄位,然後其他的表不需要用到id,其他表只取特定欄位,這樣就不會發生id重複的問題了。完美解決。
舉個栗子,比如成績表記錄的是學生id,假設欄位就叫做“學生id”,但是表格直接顯示id不知道是誰,需要顯示這個學生的姓名,那麼就用這個辦法:
select 成績表.*,學生表.姓名 from 成績表,學生表 where 成績表.學生id=學生表.id
這樣就很方便了,因為用select * from 成績表, 學生表 where 成績表.學生id=學生表.id 這樣對於結果不好獲取id的。系統預設是取後面一個表的id,比如這個語句rs("id")得到的是學生表的id,如果非要這樣也可以換個次序:select * from 學生表,成績表 where 成績表.學生id=學生表.id
這樣就很方便了,這樣用rs("id")得到的就是成績表的id了,這個好解釋,原理應該是逐個欄位儲存在一個地方,如果遇到相同的欄位比如後面又出現個id,那麼覆蓋了,所以就以後面的表為準了。
不過如果表多的話就不方便了,次序會不小心弄錯。而且下面這個情況一定就不行了,必須要用上面 表.*的方式了。
比如學生表裡有:id、姓名、年齡、幫助物件id,這個幫助物件也是一個數字編號,表示學生之間互相結成幫助物件的意思,這數字編號也存在於本表中,也是這個表中的學生id,我們把這個欄位名叫做"幫助物件id",那麼要列出學生表並且顯示出幫助物件的人的姓名就用下面的語句:
select a.*,b.姓名 as 幫助物件姓名 from學生表 a,學生表 b where a.幫助物件id=b.id
這樣列出來的就是:
id 年齡 姓名 幫助物件姓名(這一列就可以把id變成名字顯示出來啦) 用rs("幫助物件姓名")
======================
1 16 張三 小張
2 15 小張 小剛
3 16 小剛 小張
。
。
。
id | 年齡 | 姓名 | 幫助物件姓名(這一列就可以把id變成名字顯示出來啦) |
---|---|---|---|
1 | 16 | 張三 | 小張 |
2 | 17 | 小張 | 小剛 |
3 | 16 | 小剛 | 張三 |
。 | |||
。 |
perfect!