【问题标题】:How to fetch changed rows by comparing a table with its older version?如何通过将表与其旧版本进行比较来获取更改的行?
【发布时间】:2013-11-05 13:58:20
【问题描述】:

我有一个日志表和一个视图。 我想通过将视图与给定 ID_NO 的日志表进行比较来从视图中获取更改的行。 两个表之间的 ID_NO 是固定的,而其他列可以更改。

简而言之,我想从 Table1 中获取与 Table2 相比具有更多更改列的行。

例如:

TABLE 1:
ID COL1 COL2 COL3
1  A    B    C
2  34   56   D
3  F    XY   24

TABLE 2:
ID COL1 COL2 COL3
1  A    B    C
2  34   56   F
3  1    XY   24

查询应从 TABLE2 返回以下内容:

ID COL1 COL2 COL3
2  34   56   F
3  1    XY   24

请指教。 非常感谢!

【问题讨论】:

  • 请澄清您所说的“又一个已更改的列”是什么意思
  • 有问题的表的结构是什么,您希望进行哪些更改?
  • 感谢您的 cmets
  • 请原谅我的错字,我的意思是“一个或多个更改的列”
  • 我在上面加了一个小例子

标签: mysql sql database oracle plsql


【解决方案1】:
SELECT  *
FROM    one_view  vw
WHERE   EXISTS
        (
            SELECT  1
            FROM    log_table  t
            WHERE   vw.id_no = t.id_no
        )
;

问题更新后的注释:

SELECT  *
FROM    table_2  t1
WHERE   EXISTS
        (
            SELECT  1
            FROM    table_1  t2
            WHERE   t1.id_no = t2.id_no
            AND
            (
                    t1.col1 <> t2.col1
                OR  t1.col2 <> t2.col2
                OR  t1.col3 <> t2.col3
            )
        )
;

【讨论】:

  • 感谢您的回答。我在上面添加了一个小例子。您的解决方案不是从 one_view 中获取与 log_table 中的行匹配的所有行吗?
【解决方案2】:

您可以向更改表添加一个触发器,将 id 插入第二个表中,该表用于从更改表中识别更改的行。仅比较表之间的值可能有效,但需要大量工作。获取更改行的 id 可能更容易。

以防万一您还想拥有旧值,请将更改后的列和值添加到日志记录表中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-28
    • 2021-10-06
    • 2014-11-01
    • 1970-01-01
    • 2019-08-02
    • 2021-12-02
    相关资源
    最近更新 更多