如何制作一个实用方法来比较来自两个模式的任何 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 【问题描述】:假设我有两个模式 TestSchema1 和 TestSchema2。这两个模式具有相同的表和结构。另外,我有 SQL 查询作为
Select * from table_one where table_field = 'xyz'.
Select * from table_two;
这两个表 table_one 和 table_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 查询的输出的主要内容,如果未能解决你的问题,请参考以下文章