本篇主要講怎么利用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 student ( student_id int primary key, student_name nvarchar(50) not null )
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
FOR
XML PATH 語句能夠把查詢的數據生成XML數據,舉個例子,針對student表,以前SQL語句的查詢結果為:
select str(student_id) + ',' + student_name from student for xml path('student')
查詢結果:
<student> 1,張三</student> <student> 2,李四</student> <student> 3,王五</student>
student已成為一個xml文件中的結點了,再看看FOR XML PATH('')的效果,針對上述SQL作出修改,
select str(student_id) + ',' + student_name from student for xml path('')
查詢結果:
看得出來,這個參數自動把我們的查詢結果串接在一起了,這下子,要做字符串拼接就很簡單了!
4. 解答問題
要查詢想要的結果,我們首先用一般的SQL語句,連接三個表之后的結果為:
select a.student_name,b.course_name from student_course c,student a,course b where c.student_id=a.student_id and c.course_id=b.course_id
查詢結果:
| student_name |
course_name |
| 張三 |
數學 |
| 張三 |
英語 |
| 李四 |
語文 |
| 李四 |
英語 |
| 王五 |
英語 |
我們把這個查詢結果看作為一個臨時表,與自身進行一次連接,再得用FOR XML PATH('')參數來對課程course_name列進行拼接,再得用子查詢功能。這樣就得到一個每一個學生的所選的所有課程,由於上表會存在同一學生的多條記錄,所以需要對最后的結果按學生進行分組,先看看查詢語句:
select student_name, (select course_name+',' from ( select student_name,course_name from ( select a.student_name,b.course_name from stud_course c,student a,course b where c.student_id=a.student_id and c.course_id=b.course_id ) as a ) as b where c.student_name=b.student_name for xml path('') ) as course_name from ( select a.student_name,b.course_name from student_course c,student a,course b where c.student_id=a.student_id and c.course_id=b.course_id ) as c group by student_name
查詢結果:
| student_name |
course_name |
| 張三 |
數學,英語, |
| 李四 |
語言,英語, |
| 王五 |
英語, |
還有個小問題, course_name后面多出一個,號,最后做一次裁剪,假設上面的SQL語句作為一個子查詢 subquery
select student_name,left(course_name,len(course_name)-1) from (........) as subquery
這樣,就可以得出最終的結果!可以看得出來FOR XML PATH('') 參數非常強大!