从一个表中选择不在另一个表中的行与h2

时间:2016-08-08 15:14:49

标签: sql h2

我试图从另一个表中已经存在的表中获取所有记录。我会根据Age

知道它们是否存在于另一个表中

+------------+------------+------------+
| 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")

目前,这将从 Person_Backup 返回记录,并从返回所有记录。我只想要来自 Person_Backup 的记录。此外,我尝试使用GROUP BY,但它导致其他超出范围的问题,因此我不想采取这种方式。

我怀疑这是一个更简单的方法,也许是一个完全不同的查询。我想要的是选择 Person_Backup 中所有不在中使用Age作为区分因素的列。

3 个答案:

答案 0 :(得分:1)

您可以使用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)

答案 1 :(得分:1)

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

答案 2 :(得分:1)

这一行将所有三列(ID,Name和Age)视为一个字符串,并使用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)