前言
處理一對多關系,有兩種方式
(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