比较两个表并得到不同的打印输出
Compare two tables with each other and get difference printout
我的 MySQL 中有两个 table 在列方面完全相同,我们可以称它们为 id、名称、路径、日期。现在我想对这两个 table 进行比较,以便了解 table 1 与 table 2 的不同之处以及 table 2 与 [=17= 的不同之处] 1. 我只想在我的 Java 程序中打印它,现在一个简单的 System.out.print
差值就完美了。
我只想检查两个 table 中名称列中条目的差异。非常感谢任何帮助!
这将连接 id 上的 2 个表并显示名称不同的行:
select a.name, b.name
from table1 a
join table2 b on a.id = b.id
where a.name <> b.name
我确定您可以区分两个数据库并查看它们之间的差异,例如(测试数据库和生产数据库)
这是文档
https://dev.mysql.com/doc/mysql-utilities/1.5/en/mysqldbcompare.html
如果您只想查看表 1 中存在但表 2 中不存在的名称列表,请尝试以下操作:
SELECT a.name
FROM table1 a
LEFT JOIN table2 b ON a.name = b.name
WHERE table2.name IS NULL
在该查询中交换表 1 和表 2 以获得表 2 中不匹配的名称。
正确,应该接受。
这里是示例 Java JDBC 代码,展示了他的 SQL 代码的实际应用。我不使用 MySQL (如问题中所示)。相反,此示例使用 H2 Database Engine,创建临时内存数据库。
try {
Class.forName ( "org.h2.Driver" );
} catch ( final ClassNotFoundException e ) {
e.printStackTrace ( );
}
try ( Connection conn = DriverManager.getConnection ( "jdbc:h2:mem:trash_me_db" ) ;
Statement stmt = conn.createStatement ( ) ) {
String sql = null;
// Table 1
sql = "CREATE TABLE t1_ (\n" +
" id_ INT IDENTITY ,\n" +
" name_ VARCHAR \n" +
");";
stmt.executeUpdate ( sql );
stmt.execute ( "INSERT INTO t1_ ( name_ ) VALUES ('Jesse');" );
stmt.execute ( "INSERT INTO t1_ ( name_ ) VALUES ('Wendy');" );
stmt.execute ( "INSERT INTO t1_ ( name_ ) VALUES ('Lisa');" );
stmt.execute ( "INSERT INTO t1_ ( name_ ) VALUES ('Susan');" );
stmt.execute ( "INSERT INTO t1_ ( name_ ) VALUES ('Jimmy');" );
stmt.execute ( "INSERT INTO t1_ ( name_ ) VALUES ('Wine');" );
// Dump
System.out.println ( "\nDump table t1_" );
try ( ResultSet rs = stmt.executeQuery ( "SELECT * FROM t1_ ;" ) ) {
while ( rs.next ( ) ) {
final int id = rs.getInt ( "id_" ); //Retrieve by column name
final String name = rs.getString ( "name_" );
System.out.println ( "id: " + id + " | name: " + name );
}
}
// Table 2
sql = "CREATE TABLE t2_ (\n" +
" id_ INT IDENTITY ,\n" +
" name_ VARCHAR \n" +
");";
stmt.executeUpdate ( sql );
stmt.execute ( "INSERT INTO t2_ ( name_ ) VALUES ('Jesse');" );
stmt.execute ( "INSERT INTO t2_ ( name_ ) VALUES ('Wendy');" );
stmt.execute ( "INSERT INTO t2_ ( name_ ) VALUES ('Lisa');" );
stmt.execute ( "INSERT INTO t2_ ( name_ ) VALUES ('Susan');" );
stmt.execute ( "INSERT INTO t2_ ( name_ ) VALUES ('Jimmy');" );
stmt.execute ( "INSERT INTO t2_ ( name_ ) VALUES ('Beer');" );
// Dump
System.out.println ( "\nDump table t2_" );
try ( ResultSet rs = stmt.executeQuery ( "SELECT * FROM t2_ ;" ) ) {
while ( rs.next ( ) ) {
final int id = rs.getInt ( "id_" ); //Retrieve by column name
final String name = rs.getString ( "name_" );
System.out.println ( "id: " + id + " | name: " + name );
}
}
// Difference, left.
System.out.println ( "\nShow names that exist in t1_ but not in t2_." );
sql = "SELECT *\n" +
"FROM t1_ \n" +
"LEFT JOIN t2_ ON t1_.name_ = t2_.name_\n" +
"WHERE t2_.name_ IS NULL";
try ( ResultSet rs = stmt.executeQuery ( sql ) ) {
while ( rs.next ( ) ) {
final int id = rs.getInt ( "id_" ); //Retrieve by column name
final String name = rs.getString ( "name_" );
System.out.println ( "id: " + id + " | name: " + name );
}
}
// Difference, right.
System.out.println ( "\nShow names that exist in t2_ but not in t1_." );
sql = "SELECT *\n" +
"FROM t2_ \n" +
"LEFT JOIN t1_ ON t2_.name_ = t1_.name_\n" +
"WHERE t1_.name_ IS NULL";
try ( ResultSet rs = stmt.executeQuery ( sql ) ) {
while ( rs.next ( ) ) {
final int id = rs.getInt ( "id_" ); //Retrieve by column name
final String name = rs.getString ( "name_" );
System.out.println ( "id: " + id + " | name: " + name );
}
}
} catch ( final SQLException e ) {
e.printStackTrace ( );
}
当运行.
Dump table t1_
id: 1 | name: Jesse
id: 2 | name: Wendy
id: 3 | name: Lisa
id: 4 | name: Susan
id: 5 | name: Jimmy
id: 6 | name: Wine
Dump table t2_
id: 1 | name: Jesse
id: 2 | name: Wendy
id: 3 | name: Lisa
id: 4 | name: Susan
id: 5 | name: Jimmy
id: 6 | name: Beer
Show names that exist in t1_ but not in t2_.
id: 6 | name: Wine
Show names that exist in t2_ but not in t1_.
id: 6 | name: Beer
我的 MySQL 中有两个 table 在列方面完全相同,我们可以称它们为 id、名称、路径、日期。现在我想对这两个 table 进行比较,以便了解 table 1 与 table 2 的不同之处以及 table 2 与 [=17= 的不同之处] 1. 我只想在我的 Java 程序中打印它,现在一个简单的 System.out.print
差值就完美了。
我只想检查两个 table 中名称列中条目的差异。非常感谢任何帮助!
这将连接 id 上的 2 个表并显示名称不同的行:
select a.name, b.name
from table1 a
join table2 b on a.id = b.id
where a.name <> b.name
我确定您可以区分两个数据库并查看它们之间的差异,例如(测试数据库和生产数据库)
这是文档
https://dev.mysql.com/doc/mysql-utilities/1.5/en/mysqldbcompare.html
如果您只想查看表 1 中存在但表 2 中不存在的名称列表,请尝试以下操作:
SELECT a.name
FROM table1 a
LEFT JOIN table2 b ON a.name = b.name
WHERE table2.name IS NULL
在该查询中交换表 1 和表 2 以获得表 2 中不匹配的名称。
这里是示例 Java JDBC 代码,展示了他的 SQL 代码的实际应用。我不使用 MySQL (如问题中所示)。相反,此示例使用 H2 Database Engine,创建临时内存数据库。
try {
Class.forName ( "org.h2.Driver" );
} catch ( final ClassNotFoundException e ) {
e.printStackTrace ( );
}
try ( Connection conn = DriverManager.getConnection ( "jdbc:h2:mem:trash_me_db" ) ;
Statement stmt = conn.createStatement ( ) ) {
String sql = null;
// Table 1
sql = "CREATE TABLE t1_ (\n" +
" id_ INT IDENTITY ,\n" +
" name_ VARCHAR \n" +
");";
stmt.executeUpdate ( sql );
stmt.execute ( "INSERT INTO t1_ ( name_ ) VALUES ('Jesse');" );
stmt.execute ( "INSERT INTO t1_ ( name_ ) VALUES ('Wendy');" );
stmt.execute ( "INSERT INTO t1_ ( name_ ) VALUES ('Lisa');" );
stmt.execute ( "INSERT INTO t1_ ( name_ ) VALUES ('Susan');" );
stmt.execute ( "INSERT INTO t1_ ( name_ ) VALUES ('Jimmy');" );
stmt.execute ( "INSERT INTO t1_ ( name_ ) VALUES ('Wine');" );
// Dump
System.out.println ( "\nDump table t1_" );
try ( ResultSet rs = stmt.executeQuery ( "SELECT * FROM t1_ ;" ) ) {
while ( rs.next ( ) ) {
final int id = rs.getInt ( "id_" ); //Retrieve by column name
final String name = rs.getString ( "name_" );
System.out.println ( "id: " + id + " | name: " + name );
}
}
// Table 2
sql = "CREATE TABLE t2_ (\n" +
" id_ INT IDENTITY ,\n" +
" name_ VARCHAR \n" +
");";
stmt.executeUpdate ( sql );
stmt.execute ( "INSERT INTO t2_ ( name_ ) VALUES ('Jesse');" );
stmt.execute ( "INSERT INTO t2_ ( name_ ) VALUES ('Wendy');" );
stmt.execute ( "INSERT INTO t2_ ( name_ ) VALUES ('Lisa');" );
stmt.execute ( "INSERT INTO t2_ ( name_ ) VALUES ('Susan');" );
stmt.execute ( "INSERT INTO t2_ ( name_ ) VALUES ('Jimmy');" );
stmt.execute ( "INSERT INTO t2_ ( name_ ) VALUES ('Beer');" );
// Dump
System.out.println ( "\nDump table t2_" );
try ( ResultSet rs = stmt.executeQuery ( "SELECT * FROM t2_ ;" ) ) {
while ( rs.next ( ) ) {
final int id = rs.getInt ( "id_" ); //Retrieve by column name
final String name = rs.getString ( "name_" );
System.out.println ( "id: " + id + " | name: " + name );
}
}
// Difference, left.
System.out.println ( "\nShow names that exist in t1_ but not in t2_." );
sql = "SELECT *\n" +
"FROM t1_ \n" +
"LEFT JOIN t2_ ON t1_.name_ = t2_.name_\n" +
"WHERE t2_.name_ IS NULL";
try ( ResultSet rs = stmt.executeQuery ( sql ) ) {
while ( rs.next ( ) ) {
final int id = rs.getInt ( "id_" ); //Retrieve by column name
final String name = rs.getString ( "name_" );
System.out.println ( "id: " + id + " | name: " + name );
}
}
// Difference, right.
System.out.println ( "\nShow names that exist in t2_ but not in t1_." );
sql = "SELECT *\n" +
"FROM t2_ \n" +
"LEFT JOIN t1_ ON t2_.name_ = t1_.name_\n" +
"WHERE t1_.name_ IS NULL";
try ( ResultSet rs = stmt.executeQuery ( sql ) ) {
while ( rs.next ( ) ) {
final int id = rs.getInt ( "id_" ); //Retrieve by column name
final String name = rs.getString ( "name_" );
System.out.println ( "id: " + id + " | name: " + name );
}
}
} catch ( final SQLException e ) {
e.printStackTrace ( );
}
当运行.
Dump table t1_
id: 1 | name: Jesse
id: 2 | name: Wendy
id: 3 | name: Lisa
id: 4 | name: Susan
id: 5 | name: Jimmy
id: 6 | name: Wine
Dump table t2_
id: 1 | name: Jesse
id: 2 | name: Wendy
id: 3 | name: Lisa
id: 4 | name: Susan
id: 5 | name: Jimmy
id: 6 | name: Beer
Show names that exist in t1_ but not in t2_.
id: 6 | name: Wine
Show names that exist in t2_ but not in t1_.
id: 6 | name: Beer