Hir*_*iya 1 sql t-sql sql-server sql-server-2008
我有两个SQL表EmployeeMst和EmployeeCity
EmployeeMst
SrNo Name
1 abc
2 xyz
3 pqr
4 def
EmployeeCity
srno City EmplSrNo
1 Delhi 1,2,3,4
2 Mumbai 2,3,1
3 New York 3,2
Run Code Online (Sandbox Code Playgroud)
我想从EmployeeMst获取具有选择查询的员工姓名
输出如下:
srno City EmployeeName
1 Delhi abc,xyz,pqr,def
2 Mumbai xyz,pqr,abc
3 New York pqr,xyz
Run Code Online (Sandbox Code Playgroud)
这张表中有几个数据.请告诉我如何才能这样做
我用过charindex
但需要更多时间.
我仍然认为无论桌子是旧的还是新的,你都应该花时间尽快修复糟糕的设计.你只是在推迟不可避免的事情.因此,这里有一些让你开始规范化设计的东西:
-- CREATE CITY TABLE
CREATE TABLE dbo.City
(
SrNo INT,
City VARCHAR(50)
);
-- POPULATE FROM EXISTING TABLE
INSERT dbo.City (SrNo, City)
SELECT SrNo, City
FROM dbo.EmployeeCity;
-- CREATE CITY-EMPLOYEE JUNCTION TABLE USING EXISTING
-- DATA, AND XML METHOD TO SPLIT COMMA SEPARATED VALUES
-- INTO ROWS
CREATE TABLE dbo.EmployeeCity2 (CitySrNo, EmployeeSrNo)
SELECT SrNo, i.value('.', 'INT')
FROM ( SELECT SrNo,
x = CONVERT(XML, '<i>' +
REPLACE(EmplSrNo, ',', '</i><i>') +
'</i>')
FROM dbo.EmployeeCity
) AS t
CROSS APPLY t.x.nodes('i') rx (i);
-- DROP EXISTING TABLE SO THAT WE CAN CREATE A VIEW OF THE SAME NAME
DROP TABLE dbo.EmployeeCity;
GO
-- CREATE A VIEW THAT REPLICATES THE FORMAT OF THE CURRENT TABLE SO
-- THAT EXISTING SELECT QUERIES ARE NOT AFFECTED
CREATE VIEW dbo.EmployeeCity
AS
SELECT c.SrNo,
c.City,
EmplSrNo = STUFF(( SELECT ',' + CAST(EmployeeSrNo AS VARCHAR(10))
FROM dbo.EmployeeCity2 AS ec
WHERE ec.CitySrNo = c.SrNo
FOR XML PATH(''), TYPE
).value('.', 'VARCHAR(MAX)'), 1, 1, '')
FROM dbo.City AS c;
GO
-- FINALLY, THE QUERY YOU NEED TO GET THE OUTPUT IN THE QUESTION
SELECT c.SrNo,
c.City,
EmployeeName = STUFF(( SELECT ',' + m.Name
FROM dbo.EmployeeCity2 AS ec
INNER JOIN EmployeeMst AS m
ON m.SrNo = ec.EmployeeSrNo
WHERE ec.CitySrNo = c.SrNo
FOR XML PATH(''), TYPE
).value('.', 'VARCHAR(MAX)'), 1, 1, '')
FROM dbo.City AS c;
Run Code Online (Sandbox Code Playgroud)
您仍然需要修改数据的插入/更新/删除方式,但是发生这种情况的位置应该比选择的位置少得多,并且视图将覆盖您现有的所有选择查询.
要进一步阅读上面使用的几个原则来拆分逗号分隔的字符串,然后再将它重新组合在一起,请参阅: