以前,我试图将一个员工的所有以前的姓氏保留在带有逗号的表格单元格中(见下文),但我不知道如何。然后有人建议使用标准化,我不确定在这种情况下它是否会更容易。我的老板想要在每次编辑她的帐户信息时在网页上显示员工以前的所有姓氏。简单地说,当朱迪再次更改她的姓氏时 - her last name Kingsley should be inserted behind Smith
。所以,我的问题是回到是否可以在同一个单元格中添加多个姓氏,用逗号分隔,因为我认为当我在网页上使用变量来显示所有时会更简单别名马上?然而,我不知道为此编写代码的复杂性。真的很感激任何帮助。
当前SQL表
+---------------+-----------------+----------------+--------------------+
People FirstName LastName Alias
+---------------+-----------------+----------------+--------------------+
002112 Judy Smith Hall
优选
+---------------+-----------------+----------------+--------------------+
People FirstName LastName Alias
+---------------+-----------------+----------------+--------------------+
002112 Judy Kingsley Hall, Smith
答案 0 :(得分:1)
保持数据库规范化。
人:
(Id, Firstname, Lastname)
LastnameHistory:
(PeopleId, OldLastname, NewLastname, DateChanged)
您可以创建一个视图,该视图将是“GROUP_CONCAT
”类型的查询,以根据需要转换数据。
一个例子:
DECLARE @people TABLE ( id INT IDENTITY(1,1), fname VARCHAR(50), lname VARCHAR(50))
DECLARE @lnameHistory TABLE ( id INT IDENTITY(1,1), people_id INT, lname VARCHAR(50), date_changed DATETIME)
INSERT INTO @people (fname, lname)
VALUES ('john', 'smith'), ('jane', 'doe')
INSERT INTO @lnameHistory (people_id, lname, date_changed)
VALUES (2, 'shakespeare', '2012-01-01'), (2, 'einstein', '2013-12-12')
;WITH group_concat AS
(
SELECT people_id, LEFT(lnames , LEN(lnames )-1) AS lnames
FROM @lnameHistory AS o
CROSS APPLY
(
SELECT lname + ', '
FROM @lnameHistory AS i
WHERE o.people_id = i.people_id
ORDER BY date_changed ASC
FOR XML PATH('')
) pre_trimmed (lnames)
GROUP BY people_id, lnames
)
SELECT p.*, gc.lnames FROM @people p
JOIN group_concat gc ON gc.people_id = p.id
语法的一些参考:
答案 1 :(得分:0)
假设您的update语句是一个包含@personId和@newLastName参数的存储过程:
修改
抱歉,错误的SQL版本。必须以旧学校的方式去做!
UPDATE PeopleTable
SET Alias = Alias + ', ' + LastName,
LastName = @newLastName
WHERE
People = @personId
答案 2 :(得分:-1)
更新表的新LastName时,请使用以下内容:
UPDATE <table> SET Alias = Alias + ', ' + LastName, LastName = <newLastName>