Tzz: Differenz aus 2 Abfragen ermitteln

Hallo,

ich habe 2 Abfragen, bei denen jeweils eine 1-spaltige Tabelle mit Integern (nenne ich ID) als Ergebnismenge herauskommt.

Wie kann ich ermitteln, welche ID oder IDs in Tabelle 1 vorhganden sind und nicht in Tabelle 2 bzw. umgekehrt?

Lukas

  1. Tach!

    Wie kann ich ermitteln, welche ID oder IDs in Tabelle 1 vorhganden sind und nicht in Tabelle 2 bzw. umgekehrt?

    Mit EXISTS() oder NOT EXISTS().

    In das EXISTS() kommt eine Subquery, die alle Datensätze mit der ID der Haupt-Query selektiert.

    dedlfix.

    1. Hi dedlfix,

      In das EXISTS() kommt eine Subquery, die alle Datensätze mit der ID der Haupt-Query selektiert.

      Klar, EXISTS() oder IN(), NOT IN() usw. geht das gut, wenn man denn weiß, in welcher Tabelle mehr drin steht. ;)

      Weiß ich aber nicht.

      Gibts trotzdem was, womits geht?

      Lukas

      1. Tach!

        In das EXISTS() kommt eine Subquery, die alle Datensätze mit der ID der Haupt-Query selektiert.

        Klar, EXISTS() oder IN(), NOT IN() usw. geht das gut, wenn man denn weiß, in welcher Tabelle mehr drin steht. ;) Weiß ich aber nicht. Gibts trotzdem was, womits geht?

        Zwei Abfragen, die jeweils in die andere Richtung schauen.

        dedlfix.

        1. Zwei Abfrage, die jeweils in die andere Richtung schauen.

          Ok, danke. Aber dann kann ich die Ergebnismengen auch in php arrays über array_diif() vergleichen.

          Lukas

          1. Hallo und guten Tag,

            Zwei Abfrage, die jeweils in die andere Richtung schauen.

            Ok, danke. Aber dann kann ich die Ergebnismengen auch in php arrays über array_diif() vergleichen.

            Das hängt von den Datenmengen ab. Wenn Du nur <1000 Datensätze pro Tabelle hast, dann mag das gehen...
            Du brauchst ja nur das relevante Feld und die IDs zu holen.

            Grüße
            TS

            --
            es wachse der Freifunk
            http://freifunk-oberharz.de
            1. Hallo,

              Das hängt von den Datenmengen ab. Wenn Du nur <1000 Datensätze pro Tabelle hast, dann mag das gehen...

              Deutlich weniger, max. 50 pro Tabelle.

              Du brauchst ja nur das relevante Feld und die IDs zu holen.

              Das habe ich jetzt nicht so ganz verstanden.

              L.

              1. Hallo Not Lukas,

                Du brauchst ja nur das relevante Feld und die IDs zu holen.

                Das habe ich jetzt nicht so ganz verstanden.

                Du kannst deine Selects so klein wie möglich halten, musst also kein select * from benutzen, sondern nur die für den Vergleich relevanten Spalten und und die IDs abholen.

                Diese Aussage bezog sich aber auch auf Tabellen mit vielen Dantensätzen. PHP hat immer nur einen begrenzten Speicherplat zur Verfügung. Wenn Du da nun viele große Datensätze hättest, könntest Du sondt ggf. ins Out-of-Memory laufen.

                Man kann auch mit einer temporären Tabelle und insert from select arbeiten.

                Grüße
                TS

                --
                es wachse der Freifunk
                http://freifunk-oberharz.de
                1. Hallo Not Lukas,

                  :-)

                  Du brauchst ja nur das relevante Feld und die IDs zu holen.

                  Ah, ok. Ich verstehe. So hatte ich das aber auch vor.

                  Danke, L.

  2. Hi,

    ich habe 2 Abfragen, bei denen jeweils eine 1-spaltige Tabelle mit Integern (nenne ich ID) als Ergebnismenge herauskommt.

    (select x from a minus select x from b) -- ergibt die Elemente, die in a sind, aber nicht in b
    union
    (select x from b minus select x from a) -- ergibt die Elemente, die in b sind, aber nicht in a
    

    Alternativ:

    (select x from a union select x from b) -- die Vereinigungsmenge
    minus 
    (select x from a intersect select x from b) --die Schnittmenge
    

    (ob minus bzw. intersect in Deinem DBMS existiert, mußt Du in dessen Handbuch suchen - Du hast ja nicht genannt, um welches es sich handelt)

    cu,
    Andreas a/k/a MudGuard