如何制作一个实用方法来比较来自两个模式的任何 sql 查询的输出

Posted

技术标签:

【中文标题】如何制作一个实用方法来比较来自两个模式的任何 sql 查询的输出【英文标题】:How do I make a utility method that compares the output of any sql query from two schemas 【发布时间】:2018-01-10 10:25:01 【问题描述】:

假设我有两个模式 TestSchema1TestSchema2。这两个模式具有相同的表和结构。另外,我有 SQL 查询作为

Select * from table_one where table_field = 'xyz'.

Select * from table_two;

这两个表 table_onetable_two 可以有任何列。但是,模式 TestSchema1 和 TestSchema2 中的 table_one 具有完全相同的结构(数据可以不同)。

如何创建一个实用方法来比较两个模式中 SQL 语句中的数据?比如:

public boolean isDataSameInBothSchemas(String query)
//logic to compare data

更新:如果数据不匹配,我还需要知道该列,所以我不能使用 数据库中的减法操作。

【问题讨论】:

您使用的是哪个数据库?不要在 java 端比较这些表。而是创建一个新的 sql 查询来在数据库端比较它们。 我正在使用 Oracle 数据库。我还需要指定数据不匹配的列中我无法在数据库端执行的操作。 你也可以在数据库端进行。只需创建一个返回列名的函数(如 mysql 函数)。认为您的表有 10 GB 的数据,您需要比较它们。你会怎么做?使用您的方法,您需要将所有这些数据发送到 java 端。 我知道这种方法的局限性。在使用 rowNumber 限制的大型数据集的情况下,我可以批量比较数据。如果我必须在java中做到这一点,我该怎么做?当我不知道列时,我在使用 jdbcTemplate 时遇到问题。 【参考方案1】:

对于 oracle,您可以使用

Select * from schema1.table_two
minus
Select * from schema2.table_two

如果查询没有返回任何行,则数据相同。

更新: 查询也必须没有记录。

Select * from schema2.table_two
minus
Select * from schema1.table_two

我们需要从表 2 的行中减去表 1 的行,反之亦然。

对于 java 解决方案,您需要引入一个 RowDTO 类来存储每个查询的行数据。

然后引入equals()方法,供RowDTO比较对象。

将两个查询结果添加到Set<RowDTO>。 (可以是例如 HashSet)。

查询后,您将获得相应的两组。

Set<RowDTO> schema1Set;
Set<RowDTO> schema2Set;

你可以使用Set接口的方法

boolean retainAll(Collection<?> c);
boolean removeAll(Collection<?> c);

找出差异并使用剩余的项目来找出到底有什么不同。

如果您需要查找 diff 列,则需要引入自定义 util 方法来逐字段比较并显示不同的字段。

【讨论】:

在数据不匹配的情况下,如何知道哪一列没有匹配的数据? 最初的问题是关于布尔值 - 是否相同的数据。逐列比较更复杂 minus 是 Oracle 特定的。对于“标准 SQL”,应该是 except

以上是关于如何制作一个实用方法来比较来自两个模式的任何 sql 查询的输出的主要内容,如果未能解决你的问题,请参考以下文章

如何比较来自不同数据库的两个表

如何比较scala中的两个数组?

[Unity2D/3D]实用的血条制作(第二期)

使用 DAO 模式

如何按照核心数据模式实现左外连接?

我如何创建一个实用函数来检查来自 CSV 的空值并替换为打印 NULL