怎麼把子查詢的集合 轉換成主查詢的乙個字段?

2021-09-22 12:31:54 字數 3084 閱讀 5813

班級表

id class

1 一班

2 二班

學生表id student_name class_id

1 小明 1

2 小紅 1

3 小寶 2

4 小小 2

這種的會寫

select class , student_name from

student_name a

left join class b

on a.class_id=b.id

返回的實體類

class student_name

一班 小明

一般 小紅

二班 小寶

二班 小小

或者集合這種也會寫

一班: [ , ]

二班:[ ,]

返回的實體類

想要這樣的結果

返回的實體類

班級 學生

一班 小紅,小明

二班 小寶,小小

解決辦法 sql

select class_name ,group_concat(student_name)

from

student a

left join class b

on a.class_id=b.id

group by class_name

第二中方法:執行中不好用(參考)

** ;

for xml path 函式用法

一.for xml path 簡單介紹

那麼還是首先來介紹一下for xml path ,假設現在有一張興趣愛好表(hobby)用來存放興趣愛好,表結構如下:

接下來我們來看應用for xml path的查詢結果語句如下:

select * from @hobby for xml path

結果:複製**

複製**1爬山

2游泳3美食

複製**

複製**

由此可見for xml path 可以將查詢結果根據行輸出成xml各式!

那麼,如何改變xml行節點的名稱呢?**如下:
select * from @hobby for xml path(『myhobby』)

結果一定也可想而知了吧?沒錯原來的行節點變成了我們在path後面括號()中,自定義的名稱,結果如下:
複製**

複製**1爬山

2游泳3美食

複製**

複製**

這個時候細心的朋友一定又會問那麼列節點如何改變呢?還記的給列起別名的關鍵字as嗎?對了就是用它!**如下:

select hobbyid as 『mycode』,hname as 『myname』 from @hobby for xml path(『myhobby』)

那麼這個時候我們列的節點名稱也會程式設計我們自定義的名稱 與結果如下:
複製**

複製**1爬山

2游泳3美食

複製**

複製**

噢! 既然行的節點與列的節點我們都可以自定義,我們是否可以構建我們喜歡的輸出方式呢?還是看**:

select 『[ 『+hname+』 ]』 from @hobby for xml path(』』)

沒錯我們還可以通過符號+號,來對字串型別欄位的輸出格式進行定義。結果如下:

[ 爬山 ][ 游泳 ][ 美食 ]

那麼其他型別的列怎麼自定義? 沒關係,我們將它們轉換成字串型別就行啦!例如:

select 『』,』[ 『+hname+』 ]』 from @hobby for xml path(』』)

好的 for xml path就基本介紹到這裡吧,更多關於for xml的知識請查閱幫助文件!

接下來我們來看乙個for xml path的應用場景吧!那麼開始吧。。。。。。

二.乙個應用場景與for xml path應用

首先呢!我們在增加一張學生表,列分別為(stuid,sname,hobby),stuid代表學生編號,sname代表學生姓名,hobby列存學生的愛好!那麼現在表結構如下:

這時,我們的要求是查詢學生表,顯示所有學生的愛好的結果集,**如下:

複製**

複製**

select b.sname,left(stulist,len(stulist)-1) as hobby from (

select sname,

(select hobby+』,』 from student

where sname=a.sname

for xml path(』』)) as stulist

from student a

group by sname

) b複製**

複製**

結果如下:

分析: 好的,那麼我們來分析一下,首先看這句:

select hobby+』,』 from student

where sname=a.sname

for xml path(』』)

這句是通過for xml path 將某一姓名如張三的愛好,顯示成格式為:「 愛好1,愛好2,愛好3,」的格式!

那麼接著看:

複製**

複製**

select b.sname,left(stulist,len(stulist)-1) as hobby from (

select sname,

(select hobby+』,』 from student

where sname=a.sname

for xml path(』』)) as stulist

from student a

group by sname

) b複製**

複製**

剩下的**首先是將表分組,在執行for xml path 格式化,這時當還沒有執行最外層的select時查詢出的結構為:

可以看到stulist列裡面的資料都會多出乙個逗號,這時隨外層的語句:select b.sname,left(stulist,len(stulist)-1) as hobby 就是來去掉逗號,並賦予有意義的列明

HIVE子查詢轉換成連線

在hive中進行子查詢,經常會報不支援子查詢的錯誤,導致有些sql可能在mysql中可以使用但是在hive中卻無法使用,因此在hive中可以採用連線替換子查詢的方式。hive有一種連線方式,叫做左半連線,關鍵字為 left semi join,這種連線方式與左連線類似,但是屬於一種查詢的方式。教師表...

怎麼將Word轉換成PDF格式的

我們工作或者學習中常常遇到將word轉換成pdf檔案的問題,比如一些資料,不想被別人在文件上進行一些操作的時候,就可以考慮將word檔案轉換成pdf格式的。那麼如何才能很好的實現word原檔案轉換成pdf格式的呢?迅捷與迅捷pdf轉換器軟體版本類似,word轉換成pdf轉換器 依然保持了出色的wor...

pdf型別的文件怎麼轉換成txt

雖然說pdf文件的標準性給不少閱讀者提供了方便,但也給編輯文字者帶來了許多麻煩。回憶起當時畢業 設計的文段,簡直痛苦的要命。竟然傻到用print screen擷取畫面到畫圖板,再回粘到txt中,夠白了。最近接到公司內部的安排,要求將客戶傳來的資料轉成txt格式,為了能不被折磨,我花費了乙個晚上的時間...