Kreuzabfrage
Wolfram Hüttermann
- datenbank
Hallo zusammen,
Angenommen ich habe die Tabelle BEISPIEL mit den Spalten BSP1 und BSP2 vom Typ NUMBER(10) oder so. Ich möchte jetzt eine SQL-Abfrage starten, in der sich die Werte dieser beiden Spalten zwischen vorgegebenen Werten x und y bewegen (x < y, sonst ist es trivial). Die naheliegende Abfrage
SELECT ... FROM BEISPIEL
WHERE BSP1 BETWEEN X AND Y AND
BSP2 BETWEEN X AND Y
ist schon sehr langatmig. Bei drei oder noch mehr Spalten, die sich zwischen diesen Werten bewegen sollen, wäre diese o.g. Abfrage noch unübersichtlicher.
Hat jemand irgendwelche Hinweise zur Vereinfachung? Danke im Voraus.
Grüße,
Wolfram
Hi Wolfram
Hat jemand irgendwelche Hinweise zur Vereinfachung? Danke im Voraus.
Das hört sich nach Problemen beim Datenbankdesign an. Noch genauer hört es sich nach einer verletzten ersten Normalform an.
Gruss Daniela
P.S: Ja, der Begriff 1. Normalform eignet sich für Suchmaschinen.
Hallo Daniela,
1. Die Option "DESIGN" beim Forum kann für Laien alles bedeuten. Dass es etwas mit Datenbank zu tun hat, kann der Laie nicht wissen.
2. Diese Abfrage hat NICHTS mit 1. Normalform zu tun. Eigentlich sollte der Titel "Abfrage aus einer Tabelle, in der sich zwei Spalten zwischen zwei vorg. Werten bewegen" sein, aber das war dann zu lang, so dass ich nichts Geeignetes auf die Schnelle fand.
3. Hätte es die Option SQL gegeben, hätte ich es unter der Rubrik SQL gepostet.
Grüße,
Wolfram
Moin!
Die Option "DESIGN" beim Forum kann für Laien alles bedeuten. Dass es etwas mit Datenbank zu tun hat, kann der Laie nicht wissen.
Hätte es die Option SQL gegeben, hätte ich es unter der Rubrik SQL gepostet.
Daniela kritisiert nicht die Wahl deines Themenbereiches "DATENBANK" hier im Forum. "DESIGN" wäre tatsächlich unzutreffend, weil das hier "optische Gestaltung" meint.
- Diese Abfrage hat NICHTS mit 1. Normalform zu tun. Eigentlich sollte der Titel "Abfrage aus einer Tabelle, in der sich zwei Spalten zwischen zwei vorg. Werten bewegen" sein, aber das war dann zu lang, so dass ich nichts Geeignetes auf die Schnelle fand.
Abfragen haben nie was mit Normalformen zu tun, aber Normalformen gestalten die abzufragenden Tabellen.
Ich vermute, Daniela meint mit ihrem kurzen Hinweis auf die Einhaltung der Normalform folgendes:
Du hast zwei Spalten, welche sich jeweils zwischen den gleichen Werten X und Y bewegen sollen. Das bedeutet entweder, dass diese zwei Spalten die gleiche Art von Information enthalten (beispielsweise "Temperatur in Kelvin"), und deshalb besser in einer separaten Tabelle untergebracht wären.
Oder es handelt sich tatsächlich um nicht zusammenfassbare, unabhängige Informationen mit einer 1:1-Beziehung zum Datensatz - dann ist ein langer Abfragestring für jede einzelne Spalte unumgänglich. Der Spezialfall "X und Y sind identisch" hilft hierbei nicht.
Hi Sven
Oder es handelt sich tatsächlich um nicht zusammenfassbare, unabhängige Informationen mit einer 1:1-Beziehung zum Datensatz - dann ist ein langer Abfragestring für jede einzelne Spalte unumgänglich. Der Spezialfall "X und Y sind identisch" hilft hierbei nicht.
Das halte ich für sehr unwahrscheinlich wenn die gleichen Parameter zutreffen müssen, auch die Namensgebung lässt darauf schliessen, das der Fragensteller einfach die grundlegendsten Grundlagen von RDMS dringendst nachholen muss.
Gruss Daniela
Hallo,
Das halte ich für sehr unwahrscheinlich wenn die gleichen Parameter zutreffen müssen, auch die Namensgebung lässt darauf schliessen, das der Fragensteller einfach die grundlegendsten Grundlagen von RDMS dringendst nachholen muss.
Hätte deine Antwort anders ausgesehen wenn er
SELECT ... FROM FOO
WHERE BAR BETWEEN X AND Y AND
BAZ BETWEEN X AND Y
oder
SELECT ... FROM CONTAINER
WHERE LENGTH BETWEEN X AND Y AND
WIDTH BETWEEN X AND Y
geschrieben hätte?
Für mich war eigentlich schon aufgrund des Tabellennamens klar, dass es sich um keine realen Namen handelte.
Grüße
Klaus
Hi Klaus
SELECT ... FROM CONTAINER
WHERE LENGTH BETWEEN X AND Y AND
WIDTH BETWEEN X AND Ygeschrieben hätte?
Vielleicht, aber er hat ausdrücklich geschrieben, dass es mehr Felder werden auf die das zutrifft.
Gruss Daniela
Moin Sven,
die Spalten müssen sich generell nicht zwischen den zwei Werten X und Y bewegen.
Grüße,
Wolfram
yo,
Noch genauer hört es sich nach einer verletzten ersten Normalform an.
ich habe verschiedene aussagen über die erste normalform gelesen. insofern könnte google auch verwirrend sein, weil dort immer von atomarität die rede ist. der erste link, den google auspuckt:
http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
und dagegen verstößt er nicht. aber wie gesagt, ich kenne auch eine andere interpretation von der 1. normalform...
Ilja
Hallo,
Hat jemand irgendwelche Hinweise zur Vereinfachung? Danke im Voraus.
Für MySQL z.B:
SELECT ...
FROM beispiel
WHERE GREATEST(bsp1,bsp2,...) <= y
AND LEAST(bsp1,bsp2,...) >= x
(wenn ich mich nicht irre).
Andere Datenbanken werden sicherlich ähnliche Funktionen zur Verfügung stellen.
Grüße
Klaus
Hallo Klaus,
danke für den Hinweis und -- es hat so auch funktioniert.
Ich werde mir das merken, falls ich wieder vor einer solchen Situation stehe.
Grüße,
Wolfram
Grob gesagt:
Du willst also mehrere Spalten abfragen mit der gleichen!!! WHERE-Bedingung ?
Nun, das ist so selten, daß es da keine Syntax gibt.
Aber DB-Design hilft weiter:
Mache daraus zwei Tabellen mit einer 1:n Beziehung, wobei die 1 Tabelle deine ursprüngliche Tabelle ist und n die Tabelle mit den Werten.
Und dann frage die 1 Tabelle mit einem 'outer-join' ab.
Wichtig, du brauchst einen Identifier zum Verlinken, am besten den primary key aus Tabelle1
SELECT t1.* FROM tabelle1 t1, tabelle2 t2 WHERE t1.id = t2.refID AND t2.wert BETWEEN GROUP BY t1.id