Einzelnen Beitrag anzeigen

Benutzerbild von MyRealName
MyRealName

Registriert seit: 19. Okt 2003
Ort: Heilbronn
675 Beiträge
 
Delphi 10.4 Sydney
 
#1

FULL OUTER JOIN zeigt nicht alle records

  Alt 31. Okt 2017, 16:59
Datenbank: Firebird • Version: 3 • Zugriff über: UniDAC
Hallo,

hab ein seltsames Problem und bin am Rande der Verzweiflung, weil ich den Fehler nicht sehe.

Ich habe 2 Datenbanken, eine ist die aktuelle (mit der Tablelle GL und dem erzeugten Suffix _Loc) und die andere ist eine Kopie zu einem bestimmten Zeitpunkt. Das Programm kopiert die Daten der Kopie in die aktuelle DB in eine Hilfstabelle (GL_Ext). Dabei wird der Saldo (Debit-Credit) schon gebildet :

Code:
INSERT INTO GL_EXT (E, S, TIPO, NUMERO, SALDO, ACCT)
  SELECT E, S, Tipo, Batch, SUM(Debit-Credit), ACCT
  FROM GL
  WHERE Fecha BETWEEN '01/01/2016' AND '12/31/2016'
  GROUP BY E, S, Tipo, Batch, ACCT
Die Abfrage soll nun herausfinden, wo der Saldo anders ist pro Dokument (Felder E, S, Tipo und Numero/Batch) und Account Nummer (ACCT).
Dabei können die folgenden Fälle eintreten :

1. In beiden is der Saldo gleich
2. In einem der beiden ist der Saldo anders, aber E, S, Tpo, Numero, ACCT ist vorhanden
3. Auf der Rechten Seite fehlt ein Dokument (teilweise oder gänzlich), welches auf der linken Seite vorhanden ist
4. Auf der linken Seite (GL) fehlt ein Dokument (teilweise oder gänzlich), welches auf der rechten Seite vorhanden ist


Code:
SELECT A.E_Loc, A.S_Loc, A.Tipo_Loc, A.Numero_Loc, A.Saldo_Loc, A.E_Ext, A.S_Ext, A.Tipo_Ext, A.Numero_Ext, A.Saldo_Ext, A.Acct
FROM (SELECT G.ACCT,
             G.E E_Loc, G.S S_Loc, G.Tipo Tipo_Loc, G.Batch Numero_Loc, CAST(SUM(G.Debit-G.Credit) AS Currency) Saldo_Loc,
             GE.E E_Ext, GE.S S_Ext, GE.Tipo Tipo_Ext, GE.Numero Numero_Ext, COALESCE(GE.Saldo, 0) Saldo_Ext
      FROM GL G
      FULL JOIN GL_EXT GE ON (GE.E=G.E AND GE.S=G.S AND GE.Tipo=G.Tipo AND GE.Numero=G.Batch AND GE.Acct=G.Acct)
      WHERE G.Fecha BETWEEN '01/01/2016' AND '12/31/2016'
      GROUP BY G.E, G.S, G.Tipo, G.Batch, G.ACCT, GE.Saldo, GE.E, GE.S, GE.Tipo, GE.Numero) A
WHERE (A.Saldo_Loc - A.Saldo_Ext) <> 0
Mit dieser Abfrage erkenne ich die ersten 3 Fälle, den 4. aber nicht.

Abfrage GL:

E S TIPO BATCH SUM ACCT
1 1 EA 92 -139292,8 11050505
1 1 EA 92 19212,8 13551702

Abfrage GL_Ext:

E S TIPO NUMERO SALDO ACCT
1 1 EA 92 -139292,8 11050505
1 1 EA 92 19212,8 13551702
1 1 EA 92 120080 14552501

die Zeile mit der Account-Nummer 14552501 habe ich in GL_Ext, aber nicht in GL. Laut der Dokumentation vom FULL OUTER JOIN sollte die doch aber mit eingefügt werden, oder nicht ? Dann halt mit NULL von der linken Seite

Ideen ?

Geändert von MyRealName (31. Okt 2017 um 17:01 Uhr) Grund: Daten formattiert
  Mit Zitat antworten Zitat