使用 h2 从一个 table 中选择不在另一个 table 中的行

selecting rows from one table that aren't in another table with h2

我正在尝试从 table 中获取另一个 table 中不存在的所有记录。我会根据Age

知道它们是否存在于其他table中

+------------+------------+------------+
| ID         | Name       |  Age       |
+============+============+============+
| 1          | John       |   21       |
+------------+------------+------------+
| 2          | Jane       |   24       |
+------------+------------+------------+

Person_Backup

+------------+------------+------------+
| ID         | Name       |  Age       |
+============+============+============+
| 1          | John       |   22       |
+------------+------------+------------+
| 2          | Jane       |   24       |
+------------+------------+------------+

在此示例中,查询应仅响应 Person_Backup1 John 22

SELECT 
"Person_Backup"."Name", 
"Person_Backup"."Age"
FROM "Person_Backup" 
INNER JOIN "Person" ON "Person"."Name" = "Person_Backup."Name" 
WHERE ("Person"."Age" != "Person_Backup"."Age")

目前这将 return 来自 Person_Backup 的记录和来自 Person 的所有记录。不过,我只想要来自 Person_Backup 的记录。另外,我尝试使用 GROUP BY 但它导致了其他超出范围的问题,所以我不想走那条路。

我怀疑有更简单的方法解决这个问题,也许是一个完全不同的查询。我想要的只是 select Person_Backup 中不在 Person 中的所有列,使用 Age作为差异化因素。

您可以为此使用 NOT EXISTS 子句:

select *
  from person_backup b
 where not exists (select null
                     from person p
                    where p.name = b.name
                      and p.age = b.age)
SELECT 
"Person_Backup"."Name", 
"Person_Backup"."Age"
FROM "Person_Backup" 
LEFT JOIN "Person" ON "Person"."Name" = "Person_Backup"."Name" 
AND "Person"."Age" = "Person_Backup"."Age"
WHERE "Person"."ID" IS NULL

这个将所有三列(ID、姓名和年龄)视为一个字符串,并使用 CONCAT 比较表之间的字符串:

SELECT *
FROM Person_Backup
WHERE CONCAT(Person_Backup.ID, Person_Backup.Name, Person_Backup.Age)
NOT IN
(SELECT CONCAT(Person.ID, Person.Name, Person.Age) FROM Person)