我有以下表格:
DECLARE @TABLE_A TABLE (
id int identity,
name varchar(20),
start_date datetime,
end_date datetime,
details nvarchar(500),
copied_from int)
用户可以克隆一行并重新插入到同一张表中,我们记录从哪一行复制的。因此,如果您有一个ID = 1的行,并复制了它的所有列并重新插入(从UI),则会得到一个新的行,其ID = 5,新行的复制自字段将具有值为1。
在此之后,用户可以更新新行的值(例如此示例中的ID 5),我们需要一种方法来查看2行之间的差异。我编写了以下内容以获取ID 1和ID 5的列之间的差异。
DECLARE @id int = 5
DECLARE @TABLE_A TABLE (id int identity, name varchar(20), start_date datetime, end_date datetime, details nvarchar(500), copied_from int)
INSERT INTO @TABLE_A (name, start_date, end_date, details, copied_from)
SELECT 'Tom', '2017-01-01', '2017-02-01', '<p>this column can contain html mark up</p>', null UNION ALL
SELECT 'Tom', '2017-01-01', '2017-02-01', '<p>this column can contain html mark up</p>', null UNION ALL
SELECT 'Tom', '2017-01-01', '2017-02-01', '<p>this column can contain html mark up</p>', null UNION ALL
SELECT 'Tom', '2017-01-01', '2017-02-01', '<p>this column can contain html mark up</p>', null UNION ALL
SELECT 'John', '2017-01-01', '2017-02-01', '<p>this column can contain html mark up - changed</p>', 1
SELECT
'Name' AS column_name,
ISNULL(s.name, '') AS value_before,
ISNULL(t.name, '') AS value_after,
t.id,
t.copied_from
FROM @TABLE_A s
FULL OUTER JOIN @TABLE_A t ON s.id = t.copied_from
WHERE t.id = @id AND ISNULL(s.name, '') <> ISNULL(t.name, '')
UNION ALL
SELECT
'Details' AS column_name,
ISNULL(s.details, '') AS value_before,
ISNULL(t.details, '') AS value_after,
t.id,
t.copied_from
FROM @TABLE_A s
FULL OUTER JOIN @TABLE_A t ON s.id = t.copied_from
WHERE t.id = @id AND ISNULL(s.details, '') <> ISNULL(t.details, '')
.......
如您所见,ID和COPIED_FROM字段上有一个自连接,并且对于每个列,我都会检查是否存在差异。
这样做是有效的,但是我对每个列重复使用UNION操作不太满意,我想知道是否有其他方法可以实现这一点?
谢谢
UNION ALL
,这意味着如果一个记录在两个查询中都被保留,它将会在结果集中出现两次。你知道这是否可能发生吗? - Tim Biegeleisen