【发布时间】:2017-10-26 17:24:10
【问题描述】:
假设我的 SQL Server (2012) DB 中有以下“值”表:
表 1:
Id Col1 Col2 Col3 Col4
我想创建第二个“覆盖”表,该表将存储值以覆盖原始值,以防用户需要这样做。因此,根据上表,覆盖表如下所示:
覆盖:
FK_Id Col1 Col2 Col3 Col4 When_Inserted
其中Overrides.FK_Id 引用Table1.Id 作为外键。
因此,例如,假设我的Overrides 表中包含以下行,其中Table1 中的行被Id=1 覆盖:
FK_Id: Col1: Col2: Col3: Col4: When_Inserted:
1 Val1_1 Val2_1 Expected_Val3 NULL 1-Jan
1 NULL Val2_2 NULL NULL 2-Jan
1 NULL Expected_Val2 NULL NULL 3-Jan
1 Expected_Val1 NULL NULL NULL 4-Jan
然后,基于 When_Inserted 列 - 希望最新插入优先,我希望覆盖如下:
FK_Id: Col1: Col2: Col3: Col4:
1 Expected_Val1 Expected_Val2 Expected_Val3 NULL
我试图想出一种聪明的方法来创建这个 SQL,并想出了一个相当丑陋的解决方案:
SELECT
FK_Id
,(
SELECT TOP 1
Col1
FROM
Overrides O1
WHERE
Col1 IS NOT NULL
AND O1.FK_Id = O.FK_Id
ORDER BY
O1.When_Inserted DESC
) Col1
.... <same for each of the other columns> ....
FROM
Overrides O
GROUP BY
FK_Id
我确信必须有一种更清洁、更高效的更好方法。
【问题讨论】:
-
检查我的脚本,让我知道所有样本数据的输出
标签: sql sql-server group-by