【问题标题】:How to make that sql view to show data differences如何使该 sql 视图显示数据差异
【发布时间】:2015-01-28 09:21:13
【问题描述】:

最近我正在为我的数据库准备编辑历史记录。我做了一个表格,保存更新前后的记录。我在历史表中添加了对 2 条记录(更新前后的一条)进行配对的列。所以我有完整的历史表。

我现在要做的是创建复杂的(在我看来)视图。我想显示该表中所有记录之间的所有差异。让我解释一下。

我在该表中有 20 列,但让我们取 4 列来说明我的意思: 标题/作者/日期/配对索引。这些是列名。

还有数据:

Book1/Author1/30-03-1990/1
Book1/Author1/30-04-1990/1
Book2/Author2/30-03-2004/2
Book3/Author3/30-03-2004/2

在这里我有 2 个更新。第一次更新只是日期更改。第二次更新更改了书名和作者。我想在我的视图中显示如下内容:

1-- 30-03-1990 -- 30-04-1990
2-- Book2 -- Book3
2-- Author2 -- Author3

因此,每个差异都有自己的行,其中包含不同的数据。这使得每对记录都具有相同的 PairIndex。

这是我不工作的代码:

Create table Boom ( Book   VARCHAR(10),
                             author VARCHAR(10),
                             date     DATE,
                             id     INT )

INSERT INTO Boom
VALUES ( 'Book1', 'Author1', '19900330', 1 ),
       ( 'Book1', 'Author1', '19900430', 1 ),
       ( 'Book2', 'Author2', '20040330', 2 ),
       ( 'Book3', 'Author3', '20040330', 2 );

WITH cte
AS (
      SELECT Boom.*, ROW_NUMBER() over (partition by ID order by author) as RN
      FROM Boom
   ) 

select b1.id, b2.id, b1.date, b2.date
  from cte b1 
  join cte b2 
    on b1.id = b2.id 
   and b1.rn < b2.rn 
   and b1.date <> b2.date

select b1.id, b2.id, b1.author, b2.author
  from cte b1 
  join cte b2 
    on b1.id = b2.id 
   and b1.rn < b2.rn 
   and b1.author<> b2.author

【问题讨论】:

  • 你怎么能确定不会有多个更新?
  • 可以有更多 = ) 但是会有不同的ID。

标签: sql sql-server tsql view


【解决方案1】:

试试这样的:

DECLARE @SomeData AS TABLE ( Book   VARCHAR(10),
                             Author VARCHAR(10),
                             Dt     DATE,
                             ID     INT )

INSERT INTO @SomeData
VALUES ( 'Book1', 'Author1', '19900330', 1 ),
       ( 'Book1', 'Author1', '19900430', 1 ),
       ( 'Book2', 'Author2', '20040330', 2 ),
       ( 'Book3', 'Author3', '20040330', 2 );
WITH cte
AS (
    SELECT *, ROW_NUMBER() over (partition by ID order by Book, Author, Dt) as RN
    FROM @SomeData
   )

SELECT a.ID
      ,a.Book
      ,a.Author
      ,a.Dt
      ,b.Book
      ,b.Author
      ,b.Dt
FROM cte AS a LEFT JOIN cte AS b ON a.id = b.id
                                AND a.RN < b.RN
WHERE a.RN = 1

【讨论】:

  • 这很好,但我仍然需要只取差异,而不是所有行。
【解决方案2】:

需要row_number,然后寻找差异

WITH cte
AS (
      SELECT table.*, ROW_NUMBER() over (partition by ID order by author) as RN
      FROM Table
   ) 

select b1.id, b2.id, b1.date, b2.date
  from cte b1 
  join cte b2 
    on b1.id = b2.id 
   and b1.rn < b2.rn 
   and b1.date <> b2.date;

WITH cte
    AS (
          SELECT table.*, ROW_NUMBER() over (partition by ID order by author) as RN
          FROM Table
       ) 

select b1.id, b2.id, b1.author, b2.author
  from cte b1 
  join cte b2 
    on b1.id = b2.id 
   and b1.rn < b2.rn 
   and b1.author<> b2.author;

【讨论】:

  • 它似乎缺少一些数据。什么是 cte?
  • 表现出一些努力。您是否使用表的实际名称尝试过此操作? CTE 公用表表达式。
  • ofc 我做到了。我对那个 cte 有错误,这就是我问的原因。 (1 行受影响)消息 208,级别 16,状态 1,第 14 行无效的对象名称“cte”。
  • 请发布您引发错误的确切代码
  • 我创建了表,然后尝试将您的代码作为查询执行。我的意思是我把我的表名放在你得到表的地方(两次)。
猜你喜欢
  • 1970-01-01
  • 2011-03-13
  • 1970-01-01
  • 1970-01-01
  • 2021-11-25
  • 1970-01-01
  • 2013-01-21
  • 1970-01-01
  • 2010-12-28
相关资源
最近更新 更多