2016-08-08 15 views
0

Ich versuche, alle Datensätze aus einer Tabelle abzurufen, die nicht bereits in einer anderen Tabelle sind. Ich will wissen, ob sie in der anderen Tabelle vorhanden ist, basierend auf der Age SpalteAuswahl von Zeilen aus einer Tabelle, die nicht in einer anderen Tabelle mit h2 sind

Person

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

Person_Backup

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

In diesem Beispiel sollte die Abfrage reagiert nur mit 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") 

Im Moment wird dies Rückkehr einen Datensatz aus Person_Backup und alle Datensätze aus Person. Ich möchte nur die Aufzeichnungen von Person_Backup obwohl. Außerdem habe ich versucht, GROUP BY zu verwenden, aber es führte zu anderen Problemen außerhalb des Umfangs, so dass ich es vorziehen würde, diesen Weg nicht zu nehmen.

Ich vermute, es gibt einen einfacheren Weg, vielleicht eine völlig andere Abfrage. Alles, was ich will, ist, alle Spalten aus Person_Backup, die nicht in Person mit Age als Differenzierer auswählen.

Antwort

1

Dieses schaut auf allen drei Spalten - ID, Name und Alter - als eine Zeichenfolge und vergleicht die Saiten zwischen Tabellen CONCAT mit:

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) 
1

können Sie verwenden, um die NOT EXISTS Klausel für diese:

select * 
    from person_backup b 
where not exists (select null 
        from person p 
        where p.name = b.name 
         and p.age = b.age) 
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 
Verwandte Themen