使用 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_Backup
。1 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)
我正在尝试从 table 中获取另一个 table 中不存在的所有记录。我会根据Age
列
人
+------------+------------+------------+
| ID | Name | Age |
+============+============+============+
| 1 | John | 21 |
+------------+------------+------------+
| 2 | Jane | 24 |
+------------+------------+------------+
Person_Backup
+------------+------------+------------+
| ID | Name | Age |
+============+============+============+
| 1 | John | 22 |
+------------+------------+------------+
| 2 | Jane | 24 |
+------------+------------+------------+
在此示例中,查询应仅响应 Person_Backup
。1 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)