0

以前は、従業員の以前のすべての姓をカンマで表のセルに保持しようとしていましたが (以下を参照)、方法がわかりませんでした。その後、誰かが正規化を使用することを提案しましたが、この状況でより簡単になるかどうかはわかりません。上司は、従業員が自分のアカウント情報を編集するたびに、従業員の以前の姓をすべて Web ページに表示したいと考えています。簡単に言えば、ジュディが再び苗字を変えたとき – her last name Kingsley should be inserted behind Smith. それで、私の質問は、同じセルに複数の姓をカンマで区切って追加できるかどうかに戻ります.Webページで変数を使用してすべてのエイリアスを一度に表示すると簡単になると思いました. ? しかし、このためのコードを書く複雑さはわかりません。どんな助けでも本当に感謝しています。

現在の SQL テーブル

+---------------+-----------------+----------------+--------------------+
     People          FirstName         LastName            Alias
+---------------+-----------------+----------------+--------------------+
     002112            Judy             Smith              Hall

優先

+---------------+-----------------+----------------+--------------------+
     People          FirstName         LastName            Alias
+---------------+-----------------+----------------+--------------------+
     002112            Judy            Kingsley         Hall, Smith
4

3 に答える 3

1

データベースを正規化しておいてください。

人々:

(Id, Firstname, Lastname)

姓の履歴:

(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

構文の参照:

于 2013-08-21T15:22:54.670 に答える
0

update ステートメントが、@personId と @newLastName のパラメーターを受け取るストアド プロシージャであると仮定します。

編集

申し訳ありませんが、SQL のバージョンが間違っています。古い学校の方法でそれをしなければなりません!

UPDATE PeopleTable
SET Alias = Alias + ', ' + LastName,
    LastName = @newLastName
WHERE
    People = @personId
于 2013-08-21T15:23:06.583 に答える