【发布时间】:2017-10-12 08:02:49
【问题描述】:
我的问题是这样的:
我有两张桌子。一个承载真实数据,另一个用作备份。每当真实数据发生变化时,触发器就会将原始行复制到备份表中。
我需要的是:
我想选择所有原始的真实数据。这意味着真实数据表中从未更改过的所有条目以及第一次插入的备份表中的所有数据。
想象一下这些表格:
╔════════╦══════════╗ ╔══════════╦════════╦══════════╗
║ RealId ║ Numeric ║ ║ BackupId ║ RealId ║ Numeric ║
╠════════╬══════════╣ ╠══════════╬════════╬══════════╣
║ 1 ║ 3 ║ ║ 1 ║ 1 ║ 7 ║
║ 2 ║ 19 ║ ║ 2 ║ 1 ║ 9 ║
║ 3 ║ 24 ║ ║ 3 ║ 1 ║ 14 ║
║ 4 ║ 5 ║ ║ 4 ║ 2 ║ 2 ║
║ 5 ║ 23 ║ ║ 5 ║ 3 ║ 13 ║
╚════════╩══════════╝ ║ 6 ║ 5 ║ 9 ║
║ 7 ║ 5 ║ 4 ║
╚══════════╩════════╩══════════╝
我的目标是创建一个返回如下内容的查询:
╔══════════╦════════╦══════════╗
║ BackupId ║ RealId ║ Numeric ║
╠══════════╬════════╬══════════╣
║ 1 ║ 1 ║ 7 ║
║ 4 ║ 2 ║ 2 ║
║ 5 ║ 3 ║ 13 ║
║ NULL ║ 4 ║ 5 ║
║ 6 ║ 5 ║ 9 ║
╚══════════╩════════╩══════════╝
如您所见,我总是希望从备份表中返回使用特定 Realid 创建的第一个条目。 (RealId 和 BackupId 始终是唯一的)
我想到的一种方法是
SELECT MIN(BackupId), RealId
FROM BackupTable
GROUP BY RealId
至于实桌,我想到了类似的东西
SELECT *
FROM real-table A
WHERE NOT EXISTS (
SELECT *
FROM backup-table B
WHERE B.RealId = A.RealId
)
但我实在想不出组合表格的正确方法。
【问题讨论】:
-
认为你已经差不多了,但不要在 EXISTS 中使用你的派生表,从真实表中对其进行 INNER JOIN。
-
您有一个项目存在于真实表中,但没有备份的情况。一个项目可以存在于备份中但不是真实的,这也是有效的吗?
-
@SimonB real-table 可以在没有备份表的情况下保存具有 RealId 的行以拥有具有相同 RealId 的行。但是备份表总是会有一行 RealId 也存在于 real-table 中
标签: sql sql-server backup