Announcement

Collapse
No announcement yet.

Abfrage von zwei Tablellen

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

  • Abfrage von zwei Tablellen

    Guten Tag zusammen,
    habe schon etwas länger mit SQL zu tun, komme aber im folgendem Beispiel nicht weiter:

    Ich habe zwei Tabellen (Beispiel):


    MITARBEITER
    Mitarbeiter Fertigkeiten
    Heinz Putzen
    Heinz Fegen
    Klaus Putzen
    Sabine Gut aussehen
    Jeder Mitarbeiter kann X Fähigkeiten haben

    ------------------------------

    AUFGABEN
    Aufgaben Fertigkeiten
    Komplett Säubern Putzen
    Komplett Säubern Fegen
    Empfang Gut aussehen
    Kurz Saubermachen Fegen
    Jede Aufgabe benötigt X Fähigkeiten



    Aus diesen beiden Tabellen möchte ich, in diesem Beispiel, die für Aufgaben geeigneten Mitarbeiter über die Fähigkeiten herausfinden.
    Ergebniss der Abfrage sollte also so aussehen:

    Aufgaben Mitarbeiter
    Komplett Säubern Heinz
    Empfang Sabine
    Kurz Saubermachen Heinz

    Suche schon seit zwei Tagen im netz, kann aber nichts finden, das diese Aufgabe löst.
    Meine Ansätze mit einem Inner Join haben die Tabellen zwar Verknüpft, aber die Ergebnisse sind nicht wie gewollt.

    Wäre für jeden Schubser in die richtige Richtung dankbar.


    Grüße und Danke im vorraus!
    Zuletzt editiert von Maefvfis; 06.06.2014, 15:56.

  • #2
    [highlight=sql]
    with Aufgaben as (
    SELECT 'Komplett Säubern' Aufgaben, 'Putzen' Fertigkeiten FROM dual
    UNION ALL
    SELECT 'Komplett Säubern' Aufgaben, 'Fegen' Fertigkeiten FROM dual
    UNION ALL
    SELECT 'Empfang' Aufgaben, 'Gut aussehen' Fertigkeiten FROM dual
    UNION ALL
    SELECT 'Kurz Saubermachen', 'Fegen' Fertigkeiten FROM dual
    ),
    Mitarbeiter as (
    SELECT 'Heinz' Mitarbeiter, 'Putzen' Fertigkeiten FROM dual
    UNION ALL
    SELECT 'Heinz' Mitarbeiter, 'Fegen' Fertigkeiten FROM dual
    UNION ALL
    SELECT 'Klaus' Mitarbeiter, 'Putzen' Fertigkeiten FROM dual
    UNION ALL
    SELECT 'Sabine' Mitarbeiter, 'Gut aussehen' Fertigkeiten FROM dual
    )
    SELECT a.Aufgaben, m.Mitarbeiter
    FROM MITARBEITER m
    INNER JOIN AUFGABEN a ON m.Fertigkeiten = a.Fertigkeiten
    GROUP BY a.Aufgaben, m.Mitarbeiter
    HAVING COUNT(*) = (
    SELECT count(*)
    FROM AUFGABEN a2
    WHERE a2.Aufgaben = a.Aufgaben
    )
    [/highlight]

    Das sollte funktionieren. Bin mir nicht 100% sicher ob es alle Edge cases abdeckt, weil ich unten nur zähle ob die Anzahl der gematchten Fertigkeiten der Anzahl der benötigten Fertigkeiten für die Aufgabe entspricht. Aber sofern man nicht irgendwo was doppelt definiert müsste das eigentlich funktionieren. Und für mich hab ich gleich noch dazugelernt dass man in einem HAVING Statement auch noch Queries gegen die aktuelle Gruppe machen kann

    In Deinem Beispiel ist auch noch ein Fehler: "Klaus" kann nicht "kurz saubermachen" weil er dafür die Fertigkeit "Fegen" bräuchte. Du hast ihm aber nur "Putzen" gegeben. Wenn ich das abändere kann "Klaus" aber auch nur "Kurz saubermachen" und nicht "Komplett Säubern" wie "Heinz" das kann
    Zuletzt editiert von fanderlf; 06.06.2014, 15:06.

    Comment


    • #3
      Hi, danke für deine schnelle Antwort! Werd ich gleich mal mit experimentieren
      Stimmt, Klaus kann nicht kurz saubermachen, wird gleich berichtigt.

      Jetzt ist noch die Frage, kann man das ganze auch komplett dynamisch (ohne PHP o.Ä.) halten. Denn die Anzahl der Mitarbeiter und Aufgaben kann sich ständig ändern!

      Comment


      • #4
        [highlight=sql]
        SELECT a.Aufgaben, m.Mitarbeiter
        FROM MITARBEITER m
        INNER JOIN AUFGABEN a ON m.Fertigkeiten = a.Fertigkeiten
        GROUP BY a.Aufgaben, m.Mitarbeiter
        HAVING COUNT(*) = (
        SELECT COUNT(*)
        FROM AUFGABEN a2
        WHERE a2.Aufgaben = a.Aufgaben
        )
        [/highlight]

        Das kannst Du natürlich jederzeit auf jeder beliebigen Datenmenge ausführen. Oder meinst Du was anderes mit dynamisch?

        Comment


        • #5
          Jetzt check ich das, oben legste quasi den Datensatz an, womit die untere Abfrage arbeitet.
          Wieder was gelernt Gibt soviel das ich noch nicht weiß über SQL, wahnsinn.

          Danke, danke, und nochmals danke

          Comment


          • #6
            Originally posted by Maefvfis View Post
            Jetzt check ich das, oben legste quasi den Datensatz an, womit die untere Abfrage arbeitet.
            Wieder was gelernt Gibt soviel das ich noch nicht weiß über SQL, wahnsinn.

            Danke, danke, und nochmals danke
            Korrekt! Das ist besser weil man dann wirklich ein konkretes Beispiel hat und alle über dasselbe sprechen. Die untere Abfrage sollte natürlich auch mit jeder anderen beliebigen Datenmenge (hoffentlich ) funktionieren.

            Comment


            • #7
              Jap funktioniert bis jetzt einwandfrei, musste meine DB-Strucktur etwas anpassen, da ich mit Access und der "Mehrfachauswahl" gearbeitet hatte. Die n:m Tabellen hatte ich mit einem sql-befehl erzeugt, jedoch funktionierte es soo leider nicht.

              Aber jetzt gehts ja, und danke nochmals!

              Comment

              Working...
              X