kostenloser Webspace werbefrei: lima-city


SQL Frage

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    fabo

    fabo hat kostenlosen Webspace.

    Moin,

    ich habe hier eine Datenbank und stehe vor der folgenden Frage:

    Wie kann ich den Namen des Mitarbeiters und den Namen der Abteilung, in dem die Mitarbeiter arbeiten, ohne JOINS auslesen? Also dass ich im Ergebnis die Spalten "m_name" und "abt_name" erhalte? Stehe im Moment leider etwas auf dem Schlauch.

    Beitrag zuletzt geändert: 20.4.2012 21:09:31 von fabo
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Wenn du keine Joins benutzen willst, dann musst du zwei Querys benutzen.
    Das wäre unzweckmäßig.


    WIeso ohne Join?
  4. Hallo fabo,

    ich denke nicht, dass Du auf dem Schlauch stehst. Ich würde auch sagen, dass das, sofern die Aufgabenstellung ausschließlich mit einer SQL-Abfrage gelöst werden soll, nicht möglich ist.
    Sofern nur das Schlüsselwort '{INNER|OUTER|LEFT|RIGHT} JOIN' nicht verwendet werden darf und das RDBMS anhand der WHERE-Klausel implizite Joins erstellt könnte man noch sowas machen:
    SELECT mitarbeiter.m_name, abteilung.abt_name 
    FROM mitarbeiter, abteilung 
    WHERE mitarbeiter.abt_nr = abteilung.abt_nr
    Aber ich empfinde das immer als schlechten Stil, da es eben RDBMSs gibt, die tatsächlich erst alle Kombinationen aus Mitarbeitern und Abteilungen bilden und dann erst die WHERE-Bedingung anwenden, was die Performance ziemlich schnell unerträglich werden lässt.

    Beitrag zuletzt geändert: 20.4.2012 21:32:53 von darkpandemic
  5. Autor dieses Themas

    fabo

    fabo hat kostenlosen Webspace.

    darkpandemic schrieb:
    Hallo fabo,

    ich denke nicht, dass Du auf dem Schlauch stehst. Ich würde auch sagen, dass das, sofern die Aufgabenstellung ausschließlich mit einer SQL-Abfrage gelöst werden soll, nicht möglich ist.
    Sofern nur das Schlüsselwort '{INNER|OUTER|LEFT|RIGHT} JOIN' nicht verwendet werden darf und das RDBMS anhand der WHERE-Klausel implizite Joins erstellt könnte man noch sowas machen:
    SELECT mitarbeiter.m_name, abteilung.abt_name 
    FROM mitarbeiter, abteilung 
    WHERE mitarbeiter.abt_nr = abteilung.abt_nr
    Aber ich empfinde das immer als schlechten Stil, da es eben RDBMSs gibt, die tatsächlich erst alle Kombinationen aus Mitarbeitern und Abteilungen bilden und dann erst die WHERE-Bedingung anwenden, was die Performance ziemlich schnell unerträglich werden lässt.


    Danke, doch Schlauch... ^^

    @adrians

    Ich hab mir das nicht ausgedacht ^^ Was würdest du denn alternativ vorschlagen? Es geht letztlich sowohl um Redundanzfreiheit, als auch um Performance. Meine allererste Lösung war... nicht so berauschend :D

    ---

    Im Übrigen habe ich das Ganze falsch im Kopf gehabt, befürchte ich. Die Aufgabe sah wohl leicht anders aus:

    Mitarbeitername und Abteilungsname der jenigen die im Projekt Apollo arbeiten. Mal schauen, ob und wie ich das am geschicktesten Anstelle.

    Beitrag zuletzt geändert: 21.4.2012 11:58:50 von fabo
  6. Hallo fabo,

    Deine Anforderung würde man normalerweise so lösen:
    SELECT mitarbeiter.m_name, abteilung.abt_name 
    FROM  ( ( projekt INNER JOIN arbeiten
              ON project.pr_nr = arbeiten.pr_nr 
            )
            INNER JOIN mitarbeiter
              ON arbeiten.m_nr = mitarbeiter.m_nr
          )
          INNER JOIN abteilung
            ON mitarbeiter.abt_nr = abteilung.abt_nr
    WHERE projekt.pr_name LIKE 'Apollo'
    GROUP BY mitarbeiter.m_name, abteilung.abt_name
    ORDER BY mitarbeiter.m_name ASC;
    Wenn Du keine Joins machen darfst, dann benötigst Du noch eine andere Programmiersprache dazu (PHP/JAVA/C#...). Damit musst Du dann erst anhand des Projektnamens die Projektnummer abfrage:
    SELECT pr_nr FROM projekt WHERE pr_name LIKE 'Apollo'
    Mit der erhaltenen Projektnummer musst Du dann die Mitarbeiter abfragen:
    SELECT m_nr FROM arbeiten WHERE pr_nr = <Projektnummer>
    Für jeden Mitarbeiter musst Du dann den Namen und die Abteilungsnummer Abfragen:
    SELECT m_name, abt_nr FROM mitarbeiter WHERE m_nr = <Mitarbeiternummer>
    SELECT abt_name FROM abteilung WHERE abt_nr = <abt_nr von oben>
    Das ist dann insgesammt das selbe wie oben, aber wahrscheinlich langsammer,da man viel mehr abfragen benötigt.
  7. SELECT mitarbeiter.m_name, abteilung.abt_name
    FROM mitarbeiter, abteilung
    WHERE mitarbeiter.abt_nr = abteilung.abt_nr


    Nicht gut.
    Die WHERE Clause wird erst am Ende abgearbeitet. Dadurch hat man weniger Performance als mit einem JOIN. Ich empfehle definitiv oins für sowas. DEFINITIV.
  8. Autor dieses Themas

    fabo

    fabo hat kostenlosen Webspace.

    Ich hab's jetzt erst einmal so gelöst:

    SELECT mitarbeiter.m_name, abteilung.abt_name
    FROM mitarbeiter, abteilung, arbeiten, projekt
    WHERE arbeiten.m_nr = mitarbeiter.m_nr
    AND arbeiten.pr_nr = projekt.pr_nr
    AND mitarbeiter.abt_nr = abteilung.abt_nr
    AND projekt.pr_name = 'Apollo';


    Dies ist 0.0002 Sekunden schneller, als die Lösung mittels JOIN.

    Aber danke soweit für eure Hilfe :) Immerhin hab ich ja jetzt mehr als genug Wege, das Ganze überhaupt umzusetzen.

    Beitrag zuletzt geändert: 21.4.2012 16:38:59 von fabo
  9. Hallo fabo,

    wie ich oben schon erwähnt habe musst Du mit sowas aber aufpassen.
    Es gibt Datenbanksysteme wie z.B. MySQL oder Oracle die das implizit in Joins konvertieren. Dann ist das auch schnell. Wenn Du das aber auf Systemen machst, die das nicht machen (z.B. MS Access) dann gehst Du damit performancemäßig baden.
    Um das wirklich zu testen müsstest Du die Datenbank eigentlich mit einigen tausend oder zehntausend Datensätzen befüllen. Dann wird das erst repräsentativ.

    Edit: Du kannst ja noch die Sortierung und den GROUP BY weglassen. (Der GROUP BY ist sowieso falsch, da es ja zwei Mitarbeiter mit gleichem Namen geben kann.). Vielleicht ist die Laufzeit ja dann gleich.

    Beitrag zuletzt geändert: 21.4.2012 17:08:34 von darkpandemic
  10. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!