Kalle_: Kniffliges SQL- Problem

Hallöle,

normalerweise tauscht man sich ja mit Kollegen aus, wenn es mit dem eigenen Wissen klemmt. Doch leider - ich bin allein mit meinem Projekt.

Schwierige SQL-Anweisungen über mehrere Tabellen sind sonst NICHT mein täglich Brot, das Training fehlt also. Habt ihr sicher schon gemerkt in den letzten Tagen.

Das Projekt führt Aussteller und Besucher einer Fachmesse zusammen, findet Gesprächstermine. Besucherfirmen können mehrere Mitarbeiter (1..n) schicken:
table adressen:
id firma nr mitarbeiter kz
-- ----- -- ----------- --
01 ABC   01 Meyer        2  2=Besucher
57 ABC   02 Mueller      2
78 DEF   01 Gerhard      2
83 XYZ   01 NN           1  1=Aussteller

Aussteller XYZ moechte mit Firma ABC sprechen, es wird ein Kontaktsatz angelegt mit Switch Priorität 3:
table kontakte
id besucher_id aussteller_id prio_1 prio_2 prio_3 // prio_1/2=Besucher-Wunsch, prio_3=Aussteller-Wunsch
-- ----------- ------------- ------ ------ ------
11          01            83      0      0      1

Da dem Aussteller wurscht ist, mit WELCHEM Mitarbeiter der Besucherfirma er spricht, müssen also alle weiteren Mitarbeiter der Firma "ABC" auch einen Kontaktsatz bekommen. Diese Forderung kam nachträglich. Das möchte ich in einer Unterroutine automatisch lösen.
Also müssen Kontaktsätze mit prio_3=1 auch für die "Nebenmänner" INSERT werden, sofern sie noch nicht da sind oder UPDATE werden, wenn bereits prio_1 oder _2 gesetzt ist:

id besucher_id aussteller_id prio_1 prio_2 prio_3
-- ----------- ------------- ------ ------ ------
18          57            83      ?      ?      1 // Satz mit prio_1/2 könnte schon da sein!

Ich muss also gezielt DIE Sätze finden, die FEHLEN.
Vorgehen in etwa: Finde Hauptmänner (nr < 2) mit prio_3 und ihre Nebenmänner (nr>1), denen prio_3 fehlt (NULL oder 0).

Bitte um Hilfestellung.

LG Kalle

  1. Hallo,

    Ich muss also gezielt DIE Sätze finden, die FEHLEN.

    ein LEFT JOIN oder?

    SELECT adressen.id as besucherID,
    FROM adressen LEFT JOIN kontakte
    WHERE adressen.firma = 'ABC'
    AND besucherID = kontakte.besucher_id
    AND kontakte.besucher_id IS NULL;

    für den UPDATE-Fall bräuchtest Du erstmal eine Information, welche der vohandenen Datensätze zur Wunschfirma gehören. Das müsstest Du erstmal in der tabelle adressen abfragen. Die Tabellen sind halt schlecht aufgeteilt.

    Gruß, Andreas

    --
    SELFFORUM - hier werden Sie geholfen,
    auch in Fragen zu richtiges Deutsch
  2. du warst doch letztens erst mit diesem kram hier.

    Schwierige SQL-Anweisungen über mehrere Tabellen sind sonst NICHT mein täglich Brot, das Training fehlt also. Habt ihr sicher schon gemerkt in den letzten Tagen.

    die tabellenstruktur ist grausam. daher ist das so 'schwierig'. am besten wäre, erst eine 'normalisierung' der tabellen zu erreichen.

    ich glaube es schon beim letzten mal erwähnt zu haben: eine db kann nur vorhandene daten liefern. wer kann schon nicht existentes liefern ?
    deine problematik betrifft aber beziehungen. bei normalisierten beziehungen lassen sich 'fehlende' finden, weil dort keine verknüpfung vorhanden ist. hierzu ist ein JOIN von 2 tabellen erforderlich, welcher eine der beiden tabellen voll liefert. hat die verknüpfte tabelle keine passenden einträge, erstellt das db system einen NULL eintrag. dieser läßt sich in der ON bedingung abfragen und es werden nur sätze ohne verknüpfung geliefert.

    1. dieser läßt sich in der ON bedingung abfragen

      genau: ON. Mein LEFT JOIN war etwas schlampig formuliert mit WHERE...

      Gruß, Andreas

      --
      SELFFORUM - hier werden Sie geholfen,
      auch in Fragen zu richtiges Deutsch