Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

hi, hat jemand evtl. noch eine andere Lösung für mich: 

GA1 FIAE 2021 Sommer Handlungsschritt 5 d  sql

Denn das mit dem insert into mitgliedarchiv where  - das kann m.M. in der vorgeschlagenen Lösung nicht funktionieren. Was meint ihr?

Geschrieben

image.thumb.png.83b35ca0e72fba7ec09c017320060eed.png

Aufg: Erstelle eine neue Tabelle MitgliedArchiv.
Transferiere alle Mitglieder, die kein Angebot eingestellt haben, in diese Tabelle.
Lösche diese inaktiven Mitglieder aus der Tabelle Mitglied!

ok, create table sollte kein Problem sein 🙂:

CREATE TABLE MitgliedArchiv
      (idmitglied INT Primary Key,
       mitgliedName VARCHAR(30),...,
       gebDat DATE,
      fuehrungsZeugnis BOOLEAN);

AAABeeer: die (einzige) vorgeschlagene Lösung für die Korrektoren kann so nicht richtig sein (oder hat jemand zufällig noch eine Lösung vorliegen??):

INSERT INTO MitgliedArchiv
       WHERE (SELECT COUNT(idangebot) FROM Angebot WHERE mitgliedid = idmitglied) = 0;

Genauso die Delete-Anweisung, die kann so auch nicht richtig sein:

DELETE FROM Mitglied
WHERE (SELECT COUNT(idangebot) FROM Angebot WHERE mitgliedid = idmitglied) = 0;

Würde mich riesig freuen, wenn jemand mir hier weiterhelfen kann. 🙂

Geschrieben

Warum kann die Lösung deiner Meinung nach denn nicht richtig sein?

Hast du mal versucht, die Datenbank nachzustellen?

Es ist immer einfacher, zu helfen, wenn du dein Problem so weit schilderst, wie du mit deinen Gedanken gekommen bist.

Geschrieben
vor 5 Stunden schrieb netzniesserin:

INSERT INTO MitgliedArchiv
       WHERE (SELECT COUNT(idangebot) FROM Angebot WHERE mitgliedid = idmitglied) = 0;

Ist das die vollständige Lösung? Das ist syntaktisch komplett falsch. Ein INSERT-Statement hat keine WHERE-Klausel. Auch werden hier überhaupt keine Daten selektiert.

Meine Lösung würde so aussehen:

CREATE TABLE MitgliedArchiv AS
SELECT	*
FROM	Mitglied
	LEFT JOIN Angebot 
	ON Angebot.mitgliedid = Mitglied.idmitglied
WHERE	Angebot.mitgliedid IS NULL

 

DELETE FROM Mitglied
WHERE	idmitglied IN (SELECT	idmitglied
                       FROM	MitgliedArchiv)

In der MitgliedArchiv-Tabelle liegen ja nun die inaktiven Mitglieder. Also muss man doch jetzt beim Löschen einfach nur die IDs der inaktiven holen.

Geschrieben (bearbeitet)
vor 1 Stunde schrieb Whiz-zarD:

Ein INSERT-Statement hat keine WHERE-Klausel.

Das stimmt so nicht ganz. In SQL gibt es auch den Befehl INSERT INTO SELECT, der für das Kopieren von Daten vorgesehen ist.

Allerdings fehlt bei der Lösung etwas.

vor 7 Stunden schrieb netzniesserin:

INSERT INTO MitgliedArchiv
       WHERE (SELECT COUNT(idangebot) FROM Angebot WHERE mitgliedid = idmitglied) = 0;

Es scheint fast so, als ob da bei der Angabe der Lösung eine Zeile weggelassen wurde, denn richtig müsste es heißen:

INSERT INTO MitgliedArchiv
SELECT * FROM Mitglied AS m
WHERE (SELECT COUNT(idangebote) FROM Angebot AS a
WHERE a.mitgliedid = m.idmitglied )=0;

Alternativ kann man statt mit COUNT auch ein Subquery auf NOT EXISTS abfragen: 

INSERT INTO MitgliedArchiv 
SELECT * FROM Mitglied AS m
WHERE NOT EXISTS(
  SELECT mitgliedid FROM Angebot AS a
  WHERE a.mitgliedid = m.idmitglied );

Aber auch der Vorschlag von @Whiz-zarD, direkt beim CREATE ein AS SELECT zu nutzen, ist möglich. Wobei man auch da beim WHERE diverse Optionen hat.

Die DELETE-Anweisung aus der Lösung erscheint mir aber auf den ersten Blick korrekt. Was stört dich denn daran @netzniesserin?

Bei SQL ist es, wie so oft, so, dass viele Wege zum gleichen Ziel führen können. :)

Bearbeitet von Rienne
Geschrieben
vor 17 Stunden schrieb Rienne:
INSERT INTO MitgliedArchiv
SELECT * FROM Mitglied AS m
WHERE (SELECT COUNT(idangebote) FROM Angebot AS a
WHERE a.mitgliedid = m.idmitglied )=0;

Hi Rienne, da bin ich aber froh. Ja, jetzt macht es Sinn, dankeschön.

 

vor 18 Stunden schrieb Whiz-zarD:
CREATE TABLE MitgliedArchiv AS
SELECT	*
FROM	Mitglied
	LEFT JOIN Angebot 
	ON Angebot.mitgliedid = Mitglied.idmitglied
WHERE	Angebot.mitgliedid IS NULL

hi Wiz-zard - ja, so hätte ich die Aufgabe auch gelöst. Das mit dem insert into select - das wußte ich auch nicht... 

Daher ein Dankeschön für die Info, daß es für das Kopieren solch eine select gibt.

 

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...