從表中選擇數據並使用最新值更新第二個表
我有兩個表:Stampings 和 Registries。
Stampings 是從讀取 CSV 文件並插入表格的程序中填充的。表中的一些欄位是:姓名、姓氏、卡程式碼和員工新人。
系統資料庫包含姓名、姓氏、卡程式碼和員工新人。
現在,我需要一個控制項,從 Stampings 中選擇姓名、姓氏、卡片程式碼和員工新人,並使用卡片程式碼之類的唯一欄位與系統資料庫中顯示的數據進行比較。
如果來自 Stampings 和 Registries 的值不匹配,我想使用新值更新 Registries 中的記錄,例如 where cause。更新必須將最後插入的記錄放入 Stampings。
這是因為一張卡可以來自一個使用者,但在任何時候它都可以轉移給另一個人。
有人能幫我嗎?
這是我的架構:
Stampings ( ID INT Date DATE Hour VARCHAR Card-Code VARCHAR Name VARCHAR Surname VARCHAR employee-freshman VARCHAR ); Registries ( ID INT, Card-code VARCHAR Name VARCHAR Surname VARCHAR employee-freshman VARCHAR );
我使用了 C# 標記,因為在下面我報告了我正在使用的程式碼。
告訴我你是否認為這種邏輯是正確的。
using (SqlCommand selezionaCodiciTessera = new SqlCommand("SELECT Stampings.Card-code, Stampings.Surname, Stampings.Name, Stampings.employee-freshman FROM Stampings INNER JOIN Registries ON Stampings.Card-code = Registries.Card-code WHERE Stampings.Date = (SELECT MAX(Date) FROM Stampings WHERE Stampings.Card-code = Registries.Card-code) AND Stampings.Hour = (SELECT MAX(Hour) FROM Stampings WHERE Stampings.Card-code = Registries.Card-code) GROUP BY Stampings.Card-code, Stampings.Surname, Stampings.Name, Stampings.employee-freshman ORDER BY Stampings.Card-code;", connessione)) { SqlDataReader reader = selezionaCodiciTessera.ExecuteReader(); while (reader.Read()) { using (SqlConnection connessione2 = new SqlConnection(connString)) { connessione2.Open(); string query = ""; if (reader[1].ToString().Contains("'")) { string modifica = reader[1].ToString().Replace("'", "''"); query = "UPDATE Registries SET Surname = '" + modifica + "', Name = '" + reader[2].ToString() + "', employee-freshman = '" + reader[3].ToString() + "' WHERE Card-code = '" + reader[0].ToString() + "';"; using (SqlCommand aggiornaOinsersci = new SqlCommand(query, connessione2)) { aggiornaOinsersci.CommandTimeout = 180; try { aggiornaOinsersci.ExecuteNonQuery(); } catch (SqlException e) { LOG("Timeout nell'esecuzione della query. " + e.ToString()); } } } } } }
如果我理解正確,您正在嘗試用
Registries
表的最新行更新表Stampings
,用一對單引號替換單引號'
(如果存在)''
。正如我在評論中指出的那樣,您可以使用單個 SQL 命令來獲取它,您可以在 SSMS 上執行該命令或使用 C# 程序。
我已經為您的表架構設置了一個小提琴(或類似的,因為您沒有提供列大小):
CREATE TABLE Stampings ( ID INT, Date DATE, Hour VARCHAR(5), CardCode VARCHAR(3), Name VARCHAR(10), Surname VARCHAR(20), EmployeeFreshman VARCHAR(10) ); CREATE TABLE Registries ( ID INT, CardCode VARCHAR(3), Name VARCHAR(10), Surname VARCHAR(20), EmployeeFreshman VARCHAR(10) ); INSERT INTO Registries VALUES (1, 'AAA', 'Name 1', 'Surname 1', 'A'), (2, 'BBB', 'Name 2', 'Surname 2', 'B'), (3, 'CCC', 'Name 3', 'Surname 3', 'C'), (4, 'DDD', 'Name 4', 'Surname 4', 'D'); INSERT INTO Stampings VALUES (1, '20180101', '02:05', 'AAA', 'AAA Name', 'AA1 ''Surname', 'E'), (2, '20180101', '05:05', 'AAA', 'AAA Name', 'AA2 ''Surname', 'E'), (3, '20180101', '12:05', 'AAA', 'AAA Name', 'AA3 ''Surname', 'E'), (4, '20180102', '12:05', 'BBB', 'BBB Name', 'BB4 Surname', 'F'), (5, '20180102', '15:05', 'BBB', 'BBB Name', 'BB5 Surname', 'F'), (6, '20180103', '11:05', 'CCC', 'CCC Name', 'CC6 ''Surname', 'G'), (7, '20180103', '12:05', 'CCC', 'CCC Name', 'CC7 ''Surname', 'G'), (8, '20180103', '13:05', 'CCC', 'CCC Name', 'CC8 ''Surname', 'G');
現在我使用一個命令以這種方式更新您的數據:
UPDATE r SET Surname = REPLACE(s.Surname, '''', ''''''), Name = s.Name, EmployeeFreshman = s.EmployeeFreshman FROM Registries r CROSS APPLY (SELECT TOP 1 CardCode, Surname, Name, EmployeeFreshman, Date, Hour FROM Stampings WHERE CardCode = r.CardCode AND Surname LIKE '%''%' ORDER BY Date DESC, Hour DESC) s;
CROSS APPLY
join 返回每個最新Stampings
插入的行Registry
,並REPLACE(s.Surname, '''', '''''')
使用Surname
這是最終結果:
SELECT * FROM Registries; GO
身份證 | 卡碼 | 姓名 | 姓氏 | 員工大一 -: | :------- | :------- | :------------ | :--------------- 1 | AAA | AAA 名稱 | AA3 ''姓氏 | 乙 2 | 血腦屏障 | 姓名 2 | 姓 2 | 乙 3 | CCC | CCC 名稱 | CC8 ''姓氏 | G 4 | DDD | 姓名 4 | 姓 4 | D
*db<>fiddle [here](https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=b2d19eae45b5806a8ec36cb9b9c5c776)*