sql - 如何连接行 SQL?

标签 sql sql-server insert-update

很难解释我的问题,所以我添加了一张图片。

历史记录:

tblhistory

我在 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,我认为问题将得到解决。你觉得怎么样?

最佳答案

我在这里使用了子查询来仅返回 FindingIDOldValue,其中 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/

相关文章:

sql - WHERE 子句中的 PostgreSQL 多元组选择

sql - Oracle - 截断全局临时表

sql - 如何在 SQL Server 数据库表中使用 X 和 Y 网格坐标选择一圈数据?

SQL Server 时间与午夜以上时间的比较

mysql - 使用 MySQL 触发器在同一表中更新行时插入新行

php - MySQL创建触发器将内容插入同一数据库中的另一个表中

sql - PostgreSQL - 选择一列和两列中唯一值的计数

sql - 删除语句锁定表

android - 当想要选择时,在 android Sqlite 中获取错误 Index 0 requests, with a size of 0

安卓/SQLite : Insert-Update table columns to keep the identifier