很难解释我的问题,所以我添加了一张图片。
历史记录:
我在 tblother
中有 ReportedGMY
列。我需要将值更新到 ReportedGMY
中,并且必须保存在 tblhistory
旧的 ReportedGMY
值和新的 ReportedGMY
值中。
首先,我执行了 INSERT INTO SELECT
查询并保存到 tblother
中的 tblhistory
ReportedGMY
值。我更新了 tblother 并更改了值。然后,我再次插入到 tblhistory
中。
现在,我需要通过查询携带 OldValue
值。然后删除空行。怎么能做到这一点呢?或者其他方式?
插入(第二个)查询:
INSERT INTO tblhistory(FindingID, NewValue, [Date])
SELECT
ID, ReportedGMY, GETDATE() AS CurrentDateTime
FROM
(SELECT
ID, tblother.ReportedGMY,
REPLACE(tblother.ReportedGMY, ' ', '') AS NewNumbers
FROM
tblother
INNER JOIN
tblother2 ON tblother.ReportID = tblother2.ID) A
WHERE
A.ReportedGMY LIKE '%,Y,%'
OR A.ReportedGMY LIKE 'Y,%'
OR A.ReportedGMY LIKE '%,Y'
如果我可以将此查询编写为UPDATE
,我认为问题将得到解决。你觉得怎么样?
最佳答案
我在这里使用了子查询来仅返回 FindingID
和 OldValue
,其中 OldValue
IS NOT NULL
。然后,这些值将用于更新 OldValue
中具有 NULL
的行。
UPDATE a
SET a.OldValue = b.OldValue
FROM TableName a
INNER JOIN (SELECT FindingID, OldValue FROM TableName where OldValue IS NOT NULL) b
ON a.FindingID = b.FindingID
WHERE a.OldValue IS NULL
然后您可以在 ChangeArea 中使用 null
删除数据,如下所示
DELETE FROM TableName
WHERE ChangeArea IS NULL
另一种选择是将所有数据提取到临时表中,截断表,然后重新插入数据。类似这样的内容(假设您的 ID 字段是一个 IDENTITY
字段)
SELECT
FindingID
,MAX(ChangeArea) ChangeArea
,MAX(OldValue) OldValue
,MAX(NewValue) NewValue
,MAX(Date) Date
INTO #TempTable
FROM TableName
GROUP BY FindingID
TRUNCATE TABLE TableName
INSERT INTO TableName (FindingID, ChangeArea, OldValue, NewValue, Date)
SELECT
FindingID
,ChangeArea
,OldValue
,NewValue
,Date
FROM #TempTable
DROP TABLE #TempTable
这样做的优点是每个FindingID 肯定只有一行。缺点是,如果您的表很大,那么您将对 tempdb 造成很大的压力,并且可能需要一段时间来处理。
编辑:要将第二条语句更改为更新,您需要类似这样的内容;
UPDATE a
SET
a.ChangeArea = b.ReportedGMY
,a.NewValue = REPLACE(b.ReportedGMY, ' ','')
,a.Date = GETDATE()
FROM tblhistory a
INNER JOIN tblother b
ON a.FindingID = b.FindingID
WHERE b.ReportedGMY like '%,Y,%'
OR b.ReportedGMY like 'Y,%'
OR b.ReportedGMY like '%,Y'
关于sql - 如何连接行 SQL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38142131/