MySQL Abfragen

0664jester

Mitglied
Hallo,

Ich habe hier eine Abfragen, die ...
Code:
#Select DDirector, DName, CID From Department Where CID not in  ( Select CID From Company  Where CName = 'Austrianware'  );

wurde so umgeschrieben:
Code:
Select Factory.* From Factory, Vehicular_Inventory, Type Where Type.TIdentifier  = "Porsche" And Type.TNr = Vehicular_Inventory.TNr And Vehicular_Inventory.FNr =   Factory.Fnr;

Ich verstehe leider nicht, wie man das "not in" von der ersten in der zweiten ausdrückt.
 
Hallo,

was dein unterer Select da macht, ist ein Join ohne die Angabe des Schlüsselwort "JOIN". Was der obere Select macht ist ein ein SUB-Select. Der Sub-SELECT wird zuerst ausgewertet und liefert die CIDs zurück, bei denen der CName einem vorgegebenen Wert entspricht. Nehmen wir an, es wären die CIDs 5,23 und 147. Diese Ergebnisliste wird vom SUB-Select an das äußere zurück gegeben. Wenn du dir den SUB-Select jetzt weg denkst, steht da

SQL:
SELECT DDirector, DName, CID FROM Department WHERE CID NOT IN (5, 23, 127);

Das bedeutet, es sollen alle Einträge (und davon nur die Felder DDirector, DName und CID ausgegeben werden, bei denen CID nicht eine von den Zahlen in der Klammer ist.

Wenn du das jetzt auf einen JOIN wie deinen unteren anwenden willst, musst du diese Liste von CIDs bzw. die Bedingung, dass CName nicht 'Austrianware' in der Company-Tabelle sein darf einbauen.

Allerdings habe ich noch nicht verstanden, was der Obere mit dem Unteren zu tun hat. Die gehen auf komplett unterschiedliche Tabellen. Grundsätzlich würde ich den oberen aber eher so auf einen JOIN umbauen:

SQL:
SELECT d.DDirector, d.DName, d.CID
FROM Department d
INNER JOIN Company c ON d.CID = c.CID
WHERE c.CName <> 'Austrianware';
 
hallo, danke für die antwort.

So wie du das Join verwendest, kann man das auch bei mysql im dos fenster (siehe hier) verwenden?
Ich verwende den 2ten Code als vorlage, deswegen passen die beiden nicht zusammen.

Ich habe ihn mal umgeschrieben:
SQL:
Select Department.DDirector, Department.DName, Department.CID
From Company, Department
Where Company.CName = "Austrianware";
jedoch passt das "not in" noch immer nicht. Es werden immer noch alle 3 Companys (von max 3) angezeigt, wobei ich nur 2 sehen dürfte.
 
Weil die Verbindung zwischen Department und Company fehlt. Versuch es mal so:

SQL:
SELECT Department.DDirector, Department.DName, Department.CID
FROM Company, Department
WHERE Company.CID = Department.CID AND Company.CName = "Austrianware";

Das ist das gleiche wie mit der expliziten JOIN-Angabe:

SQL:
SELECT Department.DDirector, Department.DName, Department.CID
FROM Department
INNER JOIN Company ON Company.CID = Department.CID 
WHERE Company.CName = "Austrianware";

Und ja, das geht auch mit dem MySQL-Befehl an der Command-Line, denn es handelt sich um Standard-SQL und hat nichts mit dem verwendeten Client zu tun.
 
Weil die Verbindung zwischen Department und Company fehlt. Versuch es mal so:

SQL:
SELECT Department.DDirector, Department.DName, Department.CID
FROM Company, Department
WHERE Company.CID = Department.CID AND Company.CName = "Austrianware";

Es kommt genau das umgekehrte raus. XD

ich schätze mal, dass ich muss anstatt "Austrianware" alle anderen Firmen angeben und mit and verknüpfen, da ich nur 3 habe in meiner tabelle wird das kein aufwand sein...
 
Nein, du musst nur den Operator ändern:

SQL:
SELECT Department.DDirector, Department.DName, Department.CID
FROM Company, Department
WHERE Company.CID = Department.CID AND Company.CName <> "Austrianware";

Hier ist aus dem Gleichzeichen ein <> (ungleich) geworden.

Oder die Variante mit JOIN

SQL:
SELECT Department.DDirector, Department.DName, Department.CID
FROM Department
INNER JOIN Company ON Company.CID = Department.CID
WHERE Company.CName <> "Austrianware";
 
ich habe noch eine frage:

Was macht der Strichpunkt am ende? Sind das keine kommentar?
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Table structure for table `company`
--
 
Zurück