SQL Tipp

diego_armando

Banned
Registriert
Feb. 2015
Beiträge
913
Hallo,

ich habe folgende (vereinfachte) Tabelle:


tipp.jpg

Grundsätzlich will ich folgendes machen: Wenn in Spalte B ein Wert X ist, dann sollte in der Spalte C der Wert X immer ausgegeben werden, damit man in Spalte A immer einen Verweis bekommt, dass es einen Eintrag mit dem Wert "X" irgendwo in Spalte B gibt ;). Mit Case kommen ich da ja nicht weiter, da das nur auf die eine Zeile beschränkt ist.

Jemand eine Idee?

Danke!
LG Diego
 
Zuletzt bearbeitet:
Damit ich dich richtig verstehe: Es kann z.B. mehrere Zeilen mit dem Wert 1 in der Spalte A (und verschiedenen Werten in anderen Spalten) geben, aber Spalte B kann für jedes A immer höchstens einen Wert enthalten? Und dieses B, falls es existiert, willst du mit jeder Zeile verknüpfen, die A=1 hat?

Falls ja, dann würde ich dir davon abraten, das so zu machen. Das deutet für mich darauf hin, dass diese Tabelle eigentlich zwei Tabellen sein sollte: eine, die A mit B verknüpft, und eine andere, die A mit den restlichen Spalten verknüpft. Wenn du dann zu einer Zeile aus der zweiten Tabelle den passenden B-Wert hinzufügen willst, geht das ganz einfach mit einem Join.
 
Also um das etwas plastischer zu machen:

Spalte A beinhaltet z.B. eine Automarke (Wert "1"). Spalte B die Bestandteile davon (Reifen, Auspuff, etc..). Ein paar Bestandteile beinhalten aber Zusatzinformationen (Wert "4"), die eben nicht in jedem Record der Spalte B vorkommen. Wenn man jetzt eine Automarke abruft, soll via Spalte C ersichtlich sein, dass diese Automarke irgendwo in den Bestandteilen von Spalte B eine Zusatzinfo beinhaltet.

Ich will einfach sagen: Gibt es irgendwo in Spalte B einen Info, dann soll diese Info einfach auf die gesamte Automarke mit einer neuen Spalte verwiesen werden.

Denn wenn man sich jetzt nur rein die Automarke mit distinct ansieht, müsste man jeden Bestandteil auf die Zusatzinfo durchsuchen. Mit der Spalte C würde das gleich ersichtlich sein, dass es eine gibt.

Sry, ich bin nicht fürs Erklären geboren :)...
 
Zuletzt bearbeitet:
Ok, du willst also nicht alle Bestandteile für eine Marke abrufen (da hättest du die Zusatzinformationen ja schon dabei), sondern nur wissen, ob zur Marke X mindestens ein Bestandteil gehört, das Zusatzinformationen hat?

Das würde ich erst mal mit GROUP BY und Aggregationsfunktionen versuchen. Wie genau das geht, hängt auch davon ab, welche Datenbank du benutzt. Etwa so in MySQL (angenommen, in spalte_B steht NULL, falls es keine Zusatzinformationen zu dem betreffenden Bestandteil gibt):

Code:
SELECT spalte_A, COUNT(spalte_B) AS spalte_C
FROM tabelle
GROUP BY spalte_A

Das würde dir für jede Marke in "spalte_C" die Anzahl der Bestandteile mit Zusatzinformationen liefern. Wenn du noch etwas anderes brauchst oder nicht MySQL benutzt, müsstest du die Query entsprechend anpassen.
 
Für mich hört sich das so an als wenn die Info in dem Text enthalten ist und man das erstmal extrahieren muss. Wo kommen die Daten denn her? Ich würde das schon beim Load der Daten nach einem definierten Regelwerk extrahieren und in einer separaten Spalte an der Stelle speichern, wo es sinnvoll ist.
 
Verstehe Deine Frage nicht ganz, das ist doch ein ganz simpler
Code:
select spalte c from tabelle where spalte b='X';
 
Zuletzt bearbeitet:
PHuV schrieb:
Verstehe Deine Frage nicht ganz, das ist doch ein ganz simpler
Code:
select spalte c from tabelle where spalte b='X';

So würde ja, wenn ich das richtig verstanden habe, einfach die gesamte Spalte C ausgegeben werden, da sie ja alle Teile mit einer Zusatzinformation 'X' auflistet. Der TE möchte wahrscheinlich einen Datenbanktrigger, der für alle Zeilen der Spalte B die eine Zusatzinformation 'X' oder '4' o.Ä. enthalten, die Spalte C entsprechend mit diesen Informationen füllt. Leider kenn ich mich da nicht so wirklich aus, müsste aber eigentlich einfach über eine IF-Funktion zu lösen sein.:D
 
Es gibt so gut wie immer CASE WHEN. Zumindest, wenn es ein halbwegs modernes DBMS ist.
Und es gibt auch so etwas wie ISNULL (sry, bin T-SQL lastig).

Aber das vorliegende Problem würde sich lösen lassen, wenn man überhaupt erst mal eine Datenbankstruktur schaffen würde und nicht eine Datenbank als kompliziertes Excel mit schlechtem UI verwenden würde.

Grüße
 
Da ja anscheinend Spalte B auch mit ausgegeben werden soll, käme folgendes Statement in Frage:

Code:
SELECT o.spalte_a, o.spalte_b , (SELECT MAX(i.spalte_b) FROM tabelle i WHERE i.spalte_a=o.spalte_a) as spalte_c 
FROM tabelle o
 
Mit ANSI SQL kommt man nicht immer weiter - auch wenn ich persönlich versuche mich daran zu halten, wegen der Trennung der Business Logic vom Datenmodell und wegen "Vendor lock in vermeiden".
Aber nicht alle Probleme lassen sich mit ANSI SQL lösen. Und nahezu alle halbwegs modernen DBMS haben mittlerweile Kontrollstrukturen an Board.

Über den Sinn und Zweck kann man sich streiten und ich bleibe im vorliegenden Fall immer noch dabei: Erstmal ein vernünftiges Datenmodell schaffen, dann über spezifische SQL-Problemstellungen philosophieren.
 
Andreas_ schrieb:
In PL/SQL gibt es sowohl IF als auch CASE ...
Bitte genau lesen. IF ist kein kein Bestandteil des SQL-STANDARDs! Es gibt if Konstrukte als proprietäre Lösung, z.B. PL/SQL. Aber das beherrscht eben nur Oracle. Das heißt, Du kannst sowas nicht auf andere Datenbanken portieren, ganz einfach.
 
Kaum ein zeitgemäßes DBMS hält sich sklavisch an den ANSI Standard von SQL.
Die haben so gut wie alle eine erweiterte Syntax, in der sich auch wenigstens ein CASE WHEN Ausdruck findet.
Selbst das nahezu am Standard operierende PostgreSQL hat CASE WHEN. Sogar DB2 hat CASE WHEN und IBM hat den Standard maßgeblich gestaltet.

Was ist an der Aussage also falsch, dass einem in SQL mit CASE WHEN zu 99,8 % ein Kontrollausdruck zur Verfügung steht?
 
Jeopardy! Der Ausdruck einer gleichwertigen Relation zwischen zwei Entitäten.
 
PHuV schrieb:
Bitte genau lesen.
Ja bitte tue das. Mein Posting ist sehr deutlich als Antwort auf Dein Posting davor zu erkennen. Auf Grund der bescheuerten Foren-Regeln hier, darf man in diesem Fall ja nicht zitieren ... Du hast da behauptet:
PHuV schrieb:
Nicht im Standard, und in Oracle ist es ein CASE, kein IF!

PHuV schrieb:
IF ist kein kein Bestandteil des SQL-STANDARDs! Es gibt if Konstrukte als proprietäre Lösung, z.B. PL/SQL. Aber das beherrscht eben nur Oracle. Das heißt, Du kannst sowas nicht auf andere Datenbanken portieren, ganz einfach.
PL/SQL ist die Erweiterung der SQL-Syntax von Oracle. Da ist es völlig klar, dass es das nur bei Oracle gibt und kein Bestandteil des SQL-Standards ist. Was soll also der Unsinn dieses noch einmal zu betonen? Langeweile?
 
Zuletzt bearbeitet:
Zurück
Oben