本篇主要講怎么利用SQL的FOR XML PATH 參數來進行字符串拼接,FOR XML PATH的用法很簡單,它會以xml文件的形式來返回數據。
我的講解步驟:
1:構造初始數據
2:提出問題
3:簡單介紹FOR XML PATH
4:解答問題
1.構造初始數據
舉出一個經典的學生課程例子,共有學生、課程與學生課程三張表。
表1:Student
student_id | student_name |
1 | 張三 |
2 | 李四 |
3 | 王五 |
表2:Course
course_id | course_name |
1 | 語言 |
2 | 數學 |
3 | 英語 |
表3:Student_Course
student_id | course_id |
1 | 2 |
1 | 3 |
2 | 1 |
2 | 3 |
3 | 3 |
腳本:
create table course ( course_id int primary key, course_name nvarchar(50) not null )
create table student_course ( student_id int not null, course_id int not null, primary key(student_id,course_id) )
2.提出問題
寫一條SQL語句,查詢顯示出下列結果:
student_name | course_name |
張三 | 數學,英語 |
李四 | 語言,英語 |
王五 | 英語 |
3.簡單介紹 FOR XML PATH
查詢結果:
student已成為一個xml文件中的結點了,再看看FOR XML PATH('')的效果,針對上述SQL作出修改,
查詢結果:
看得出來,這個參數自動把我們的查詢結果串接在一起了,這下子,要做字符串拼接就很簡單了!
4. 解答問題
查詢結果:
student_name | course_name |
張三 | 數學 |
張三 | 英語 |
李四 | 語文 |
李四 | 英語 |
王五 | 英語 |
我們把這個查詢結果看作為一個臨時表,與自身進行一次連接,再得用FOR XML PATH('')參數來對課程course_name列進行拼接,再得用子查詢功能。這樣就得到一個每一個學生的所選的所有課程,由於上表會存在同一學生的多條記錄,所以需要對最后的結果按學生進行分組,先看看查詢語句:
查詢結果:
student_name | course_name |
張三 | 數學,英語, |
李四 | 語言,英語, |
王五 | 英語, |
還有個小問題, course_name后面多出一個,號,最后做一次裁剪,假設上面的SQL語句作為一個子查詢 subquery
這樣,就可以得出最終的結果!可以看得出來FOR XML PATH('') 參數非常強大!