2016-09-21 3 views
2

Ich habe 2 Tabellen, die ich vergleichen muss, um zu wissen, welche Daten in sind oder nicht. Ich versuche die Anfrage zu finden, finde sie aber noch nicht. Die Daten zu vergleichen sind, in detail1 und detail2 gespeichert sind, wie folgt definiert:Vergleichen von 2 Tabellen, um Unterschiede zu überprüfen

detail1 
D1_ID (integer) 
D1_MASTERID (integer) 

mit Daten

| D1_MASTERID | D1_ID | 
|  1  | 1 | 
|  1  | 3 | 



detail2 
D2_ID (integer) 
D2_MASTERID (integer) 

mit Daten

| D2_MASTERID | D2_ID | 
|  1  | 1 | 
|  1  | 2 | 
|  1  | 4 | 

und

master 
MASTER_ID (integer) 

mit Daten

| MASTERID | 
|  1 | 

Ich habe versucht, viele Art und Weise, und dies ist der letzte Versuch, die noch Arbeit doesnn't:

select MASTER_ID, D1_ID, D2_ID 
FROM master 
LEFT JOIN detail1 ON MASTERID=D1_MASTERID 
LEFT JOIN detail2 ON MASTERID=D2_MASTERID 

Das Ergebnis i erhalten, ist so etwas wie

| MASTERID | D1_ID | D2_ID | 
| 1  | 1 | 1 | 
| 1  | 1 | 2 | 
| 1  | 1 | 4 | 
| 1  | 3 | 1 | 
| 1  | 3 | 2 | 
| 1  | 3 | 4 | 

Was Ich mag würde zu bekommen ist:

| MASTERID | D1_ID | D2_ID | 
| 1  | 1 | 1 | 
| 1  |  | 2 | 
| 1  | 3 |  | 
| 1  |  | 4 | 

Ich dachte, eine linke Join kann so ... aber es funktioniert nicht. oder Unterabfragen? Ich bin wirklich nicht sicher

i die Seite überprüft http://sql.sh/cours/jointures aber es hilft auch nicht ...

Thx

+2

Ist es mysql oder Orakel? Auch, bitte posten Sie die Startdaten für Ihr erwartetes Ergebnis – Aleksej

+0

Eigentlich ist es auf Oracle (aber es kann in MySQL später sein) ... – ffert2907

Antwort

2

Sie könnten erste Abfrage detail1 und die passenden Zeilen in detail2. Dann fügen Sie die Liste der detail2 Zeilen, die keine Übereinstimmung in detail1 haben:

select master_id, d1_id, d2_id 
from master 
left join 
     detail1 
on  master_id = d1_master_id 
left join 
     detail2 
on  master_id = d2_master_id 
     and d1_id = d2_id 
union all 
select master_id, d1_id, d2_id 
from master 
left join 
     detail2 
on  master_id = d2_master_id 
left join 
     detail1 
on  master_id = d1_master_id 
     and d1_id = d2_id 
where d1_id is null -- Row not found in d1 

Example at SQL Fiddle.

+0

Dies funktioniert ordnungsgemäß. und kompatibel mit allen Arten von DB. thx – ffert2907

4

In Oracle Sie verwenden können FULL OUTER JOIN

select NVL(d1_masterid, d2_masterid) as masterid, d1_id, d2_id 
from 
     detail1 
FULL OUTER JOIN 
     detail2 
on  d1_masterid = d2_masterid 
and  d2_id = d1_id 
; 

oder Master konnte enthält IDs, die nicht sind vorhanden in beiden detaillierten Tabellen:

with det as 
(
select NVL(d1_masterid, d2_masterid) as masterid, d1_id, d2_id 
from 
     detail1 
FULL OUTER JOIN 
     detail2 
on  d1_masterid = d2_masterid 
and  d2_id = d1_id 
) 
select distinct m.masterid, d1_id, d2_id 
from 
    master m 
LEFT OUTER JOIN 
det 
on m.masterid = det.masterid 
+0

Schöne Lösung (Frage wurde MySQL früher markiert, aber Oracle unterstützt volle Joins) – Andomar

+0

@Andomar: danke ich habe meine Antwort bearbeiten – schurik

+0

erste Lösung gibt kein richtiges Ergebnis. es gibt nur die aus Detail2 zurück, die nicht mit Detail 1 übereinstimmt – ffert2907

Verwandte Themen