Announcement

Collapse
No announcement yet.

Verneinen beim join?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Verneinen beim join?

    Hallo Leute,

    weiß jemand ob dies geht:?

    Ich habe 2 Tabellen, nun möchte ich aus der ersten tabelle die daten sehen die nicht in der 2 drin sind?

    hier mal ein Beispiel:

    select a.spalte1
    from tabelle a
    join tabelle b
    on !(a.spalte = b.spalte)

    Verstanden geht das so? Habe es mal ausprobiert aber nach 2 min hab ich die query abgebrochen.
    Hat jemand evtl. eine idee wie ich das realiesieren könnte?

    Vielen Dank

    LG aus Hessen :-)

  • #2
    select
    a.spalte1
    from
    tabelle a
    join tabelle b
    on (a.spalte <> b.spalte)

    Comment


    • #3
      Originally posted by Markus Kinzler View Post
      select
      a.spalte1
      from
      tabelle a
      join tabelle b
      on (a.spalte <> b.spalte)
      Hallo Markus,

      dies lößt das Problem von Francesco nicht! Du bekommst hier eine Datenmenge, die jeden Datensatz aus tabelle a mit ALLEN (bis auf evtl. einen) DS aus tabelle b verknüpft!
      Das Problem kann man am besten mit einem WHERE NOT IN lösen. z.B.:
      Code:
      SELECT a.spalte1
      FROM tabelle a
      WHERE a.spalte NOT IN (
        SELECT b.spalte
        FROM tabelle b)
      Subselects funktionieren aber erst ab MYSQL 4.

      Alternativ kannst du auch einen normalen OUTER JOIN verwenden und die Datenmenge dann zusätzlich mit WHERE b.spalte IS NULL einschräncken:
      Code:
      SELECT a.spalte1
      FROM tabelle a
      LEFT OUTER JOIN tabelle b
        ON a.spalte = b.spalte
      WHERE b.spalte IS NULL
      Gruß Falk
      Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

      Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

      Comment


      • #4
        Hallo Falk,

        du hast recht. Ich habe mir die Frage nicht genau (genug) durchgelesen und nur seine Negierung korrigiert.

        Comment


        • #5
          Vielen Dank Falk,

          ich habs verstanden und auch gleich umgesetzt!

          Liebe Grüße

          Francesco

          Comment


          • #6
            Angenommen Tabelle A besteht hier aus ca. 200.000 Datensätze und Tabelle B aus ca. 500 - bedeutet das dann, dass hier 100.000.000 Vergleiche gemacht werden?

            Freundliche Grüße

            Bernhard

            Comment


            • #7
              Originally posted by Berni View Post
              Angenommen Tabelle A besteht hier aus ca. 200.000 Datensätze und Tabelle B aus ca. 500 - bedeutet das dann, dass hier 100.000.000 Vergleiche gemacht werden?
              Im schlimmsten Fall sicherlich: Ja!
              Bei größeren Datenmengen sollte man sich immer auch grundlegende Gedanken über eine sinnvolle Indizierung machen.
              Auch gibt es (meist) Alternativen beim verwendeten SQL selbst. z.B. bietet sich immer dann, wenn die Datenmenge im Subselect sehr viel größer ist als in Tabelle A, ein ...WHERE (NOT) EXISTS (SELECT...) an. Hierbei kann man dann im Subselect Primary oder Unique Keys ausnutzen und die Abfrage erheblich beschleunigen.
              Grundlegend läuft das hier diskutierte Problem jedoch immer auf einen Mengenvergleich hinaus und ist in jedem Fall sehr Datenbanklastig. Beim Datenbankdesign sollte man solche Abfragen (bei großen Datenmengen) also möglichst vermeiden, bzw. durch entsprechende Redundanz dafür Sorgen, daß der Abfrageaufwand verringert wird.

              Gruß Falk
              Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

              Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

              Comment

              Working...
              X