none
2 x NOT EXISTS geht das? welche Feld fehlt wo?

    Frage

  • Hallo Zusammen,

    Habe folgende Abfrage:

    SELECT Feld_1, Feld_2, Feld_3 FROM Tabelle_A

    WHERE NOT EXISTS (SELECT * FROM Tabelle_B WHERE Tabelle_A.Feld_2=Tabelle_B.Feld_2)

    OR NOT EXISTS (SELECT * FROM Tabelle_C WHERE Tabelle_A.Feld_3=Tabelle_C.Feld_3)

    Kann die Abfrage ergänzt werden, um festzustellen ob in dem Satz nur Feld_2 oder Feld_3 fehlt, oder ob beide Felder fehlen?

    Sage jetzt schon vielen Dank für einen Hinweis.

    Grüße

    Dienstag, 13. Februar 2018 17:29

Antworten

  • Hallo Adam,

    probiers mal hiermit.

    SELECT a.Feld_1,
           a.Feld_2,
           a.Feld_3,
           CASE
               WHEN b.Feld_2 IS     NULL AND c.Feld_3 IS     NULL THEN 'Beide leer'
               WHEN b.Feld_2 IS     NULL AND c.Feld_3 IS NOT NULL THEN 'B leer'
               WHEN b.Feld_2 IS NOT NULL AND c.Feld_3 IS     NULL THEN 'C leer'
           END AS 'LeereFelder'
    FROM   Tabelle_A a
           LEFT JOIN Tabelle_B b ON a.Feld_2 = b.Feld_2
           LEFT JOIN Tabelle_C c ON a.Feld_3 = c.Feld_3
    WHERE  b.Feld_2 IS NULL
    OR     c.Feld_3 IS NULL

    HTH


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Dienstag, 13. Februar 2018 17:44
    Moderator

Alle Antworten

  • Hallo Adam,

    probiers mal hiermit.

    SELECT a.Feld_1,
           a.Feld_2,
           a.Feld_3,
           CASE
               WHEN b.Feld_2 IS     NULL AND c.Feld_3 IS     NULL THEN 'Beide leer'
               WHEN b.Feld_2 IS     NULL AND c.Feld_3 IS NOT NULL THEN 'B leer'
               WHEN b.Feld_2 IS NOT NULL AND c.Feld_3 IS     NULL THEN 'C leer'
           END AS 'LeereFelder'
    FROM   Tabelle_A a
           LEFT JOIN Tabelle_B b ON a.Feld_2 = b.Feld_2
           LEFT JOIN Tabelle_C c ON a.Feld_3 = c.Feld_3
    WHERE  b.Feld_2 IS NULL
    OR     c.Feld_3 IS NULL

    HTH


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Dienstag, 13. Februar 2018 17:44
    Moderator
  • Hallo Stefan,

    CASE geht nicht weil ACCESS, habe deshalb folgendes probiert:

    SELECT A.Feld_1, A.Feld_2, A.Feld_3,

    SWITCH (B.Feld_2 IS NULL AND C.Feld_3 IS NULL, 'Beide leer',

            B.Feld_2 IS NULL AND C.Feld_3 IS NOT NULL, 'B leer',

            B.Feld_2 IS NOT NULL AND C.Feld_3 IS NULL, 'C leer') AS Leerfelder

    FROM (Tabelle_A A INNER JOIN Tabelle_B B ON B.Feld_2 = A.Feld_2) INNER JOIN       Tabelle_C C ON C.Feld_3 = A.Feld_3

    WHERE B.Feld_2 IS NULL OR C.Feld_3 IS NULL

    Mit "WHERE ... " werden keine Sätze gefunden. Ohne "WHERE ..." werden genau die Sätze angezeigt die nicht geszucht werden.

    Sorry, wenn ich meine Frage in der falschen Gruppe gepostet habe.

    Grüße

    Mittwoch, 14. Februar 2018 15:53
  • Mach statt INNER join ein LEFT Join.
    Durch den INNER join erzwingst du eine Existenz, so dass B/C.Feld nur NULL sein können, wenn die Tabelle B/C es erlaubt.

    Mittwoch, 14. Februar 2018 16:10
  • Hallo Adam,

    und warum postest Du dann im SQL Server Forum, wenn Du Access verwendest?

    Wie bfuerchau und ich selbst auch schon im Beispiel geschrieben hatte, musst Du die Tabellen mit LEFT JOIN verbinden. Ansonsten siehst Du nur die Datensätze, in denen es in beiden Tabellen die gleichen Werte in den entsprechenden Spalten gibt. Das willst Du ja aber nicht.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Mittwoch, 14. Februar 2018 17:29
    Moderator