SQL Frage
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
abfrage
abfragen
abteilung
anwenden
apollo
arbeiten
aufgabenstellung
bedingung
benutzen
bilden
code
dank
klausel
kombination
mitarbeiter
performance
projekt
sagen
schlauch
url
-
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 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Wenn du keine Joins benutzen willst, dann musst du zwei Querys benutzen.
Das wäre unzweckmäßig.
WIeso ohne Join? -
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:
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.SELECT mitarbeiter.m_name, abteilung.abt_name FROM mitarbeiter, abteilung WHERE mitarbeiter.abt_nr = abteilung.abt_nr
Beitrag zuletzt geändert: 20.4.2012 21:32:53 von darkpandemic -
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:
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.SELECT mitarbeiter.m_name, abteilung.abt_name FROM mitarbeiter, abteilung WHERE mitarbeiter.abt_nr = abteilung.abt_nr
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 -
Hallo fabo,
Deine Anforderung würde man normalerweise so lösen:
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 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;
Mit der erhaltenen Projektnummer musst Du dann die Mitarbeiter abfragen:SELECT pr_nr FROM projekt WHERE pr_name LIKE 'Apollo'
Für jeden Mitarbeiter musst Du dann den Namen und die Abteilungsnummer Abfragen:SELECT m_nr FROM arbeiten WHERE pr_nr = <Projektnummer>
SELECT m_name, abt_nr FROM mitarbeiter WHERE m_nr = <Mitarbeiternummer>
Das ist dann insgesammt das selbe wie oben, aber wahrscheinlich langsammer,da man viel mehr abfragen benötigt.SELECT abt_name FROM abteilung WHERE abt_nr = <abt_nr von oben>
-
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. -
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 -
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 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage