MSSQL數據庫一對多和多對一查詢的轉換


前言

處理一對多關系,有兩種方式

(1)創建關系表,將對應關系保存在物理表中。

(2)表中添加一個字段,將多關系的值以特殊符號隔開進行保存.

本例使用的就是,以逗號隔開(InterestID='1,2,3,4')

示例語句

測試數據表的創建語句

--學生表
CREATE table Student
(
Name nvarchar(50),--姓名
InterestID varchar(50)--興趣編號
)
--基礎信息表
CREATE table BaseInfo
(
InterestID int,--興趣編號
InterestName varchar(10)--興趣名稱
)

--測試數據
insert INTO BaseInfo
SELECT 1,'乒乓球'
UNION
SELECT 2,'籃球'
UNION
SELECT 3,'足球'
UNION
SELECT 4,'網球'
UNION
SELECT 5,'羽毛球'

--一對多關系示例數據
INSERT INTO Student
SELECT '李健康','1,3,4'
UNION
SELECT '方時赫','2'

--一對一關系示例數據
INSERT INTO Student
SELECT 'Mike','1'
UNION
SELECT 'Mike','2'
UNION
SELECT 'Mike','4'

查詢方式

(1)字段中保存多個值(一條記錄對應多條記錄),關聯仍為一條數據

SELECT a.Name,a.InterestID
,InterestName=
STUFF
(
    (
        SELECT ','+LTRIM(b.InterestName)
        FROM BaseInfo b        
        WHERE CHARINDEX(','+LTRIM(b.InterestID),','+a.InterestID)>0 FOR XML PATH('')
    )
    ,1,1,''
)
FROM Student a

原結果集:

Name    InterestID
李健康    1,3,4
方時赫    2

關聯結果集:

Name    InterestID    InterestName
李健康    1,3,4       乒乓球,足球,網球
方時赫    2        籃球

(2)字段中保存多個值(一條記錄對應多條記錄),關聯為多條數據

SELECT x.Name,y.InterestID FROM
(                                   
      SELECT Name
    ,InterestID = CONVERT(xml,'<root><v>' + REPLACE(InterestID, ',', '</v><v>') + '</v></root>')
    FROM Student
) x
OUTER APPLY
(
  SELECT InterestID = N.v.value('.', 'varchar(100)') FROM x.InterestID.nodes('/root/v') N(v)
) y

原結果集:

Name    InterestID
李健康    1,3,4
方時赫    2

關聯結果集:

Name    InterestID
李健康    1
李健康    3
李健康    4
方時赫    2

(3)字段中保存一個值,關聯為一對多的關系

select Name,
stuff
(
    (  
    select ','+ InterestID from Student as b where b.Name = a.Name for xml path('')
    )
    ,1,1,''
) as InterestID
from Student as a  
group by Name

原結果集:

Name    InterestID
李健康    1,3,4
方時赫    2
Mike       1
Mike       2
Mike       4

關聯結果集:

Name      InterestID
Mike       1,2,4
方時赫    2
李健康    1,3,4


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM