Mehrere Tabellen auf Eintrag durchsuchen

SupMap

Benutzer
Beiträge
6
Hallo !

Ich muss mehrere Tabellen (TabelleA, TabelleB, TabelleC, TabelleD) auf einen Eintrag durchsuchen der im Feld "MODELL" den Wert "13" hat und dann den Eintrag mit allen seinen Werten ausgeben. Die Tabellen haben alle verschiedene Felder, bis auf das gemeinsame Feld "MODELL" dessen Werte immer sich nie wiederholen.

Ich hatte an "SELECT * FROM `TabelleA`, `TabelleB`, `TabelleC`, `TabelleD` where model=13" gedacht aber das scheint nicht zu funktionieren. Hat einer eine Idee ?

Vielen Dank !

EDIT: Für das Verständniss, ich habe drei Tabellen die nach einem bestimmten Wert im Feld "MODELL" durchsucht werden müssen. Der Wert ist IMMER nur in einer der Tabellen vorhanden. Sollte der Datensatz mit dem Wert gefunden werden, soll der Datensatz ausgegeben werden also "*"
 
Zuletzt bearbeitet:
Werbung:
Werden Ähnliche Daten in den Tabellen gespeichert, wenn es überall eine Spalte Modell gibt?
Wieso dann unterschiedliche Tabellen?
 
Hi ! Es sind ähnliche Daten, die jedoch trotzdem getrennt werden müssen. Z.B.: Eine Tabelle für Bügeleisen-Modelle mit den Attributen POWER und TEMPERATUR, eine Tabelle für Waschmaschinen mit den Attributen VOLUMEN und DREHZAHL usw. Alle Tabellen haben jedoch eine unikate Modellnummer, nach der gesucht werden wird
 
Es sind ähnliche Daten, die jedoch trotzdem getrennt werden müssen. Z.B.: Eine Tabelle für Bügeleisen-Modelle mit den Attributen POWER und TEMPERATUR, eine Tabelle für Waschmaschinen mit den Attributen VOLUMEN und DREHZAHL usw.

Dein Geschäft ist zum scheitern verurteilt, weil Du mit der Umprogrammierung nicht mehr nachkommen wirst. Neben Bügeleisen und Waschmaschinen könntest Du auch noch Radiergummi, Kondome und Raumschiffe verkaufen, nur haben die blöderweise alle unterschiedliche Eigenschaften. Du mußt ständig neue Tabellen anlegen und wirst recht schnell kollabieren.

Schade, gell?
 
Abend !

Vielen Dank für den Tipp, natürlich könnte ich auch vieles andere verkaufen, tuhe ich aber nicht denn die Waschmaschinen und Bügeleisen waren nichts weiter als ein Beispiel und es handelt sich auch nicht um eine Datenbank für einen Onlineshop. Es bleibt bei den 3 Tabellen, kann mir vielleicht jemand eine konstruktive Antwort auf meine Frage geben ? Vielen Dank !
 
Wenn Deine Tabellen unterschiedliche Felder haben, kannst das weitestgehend vergessen, bis auf:

select * from (select 'tabelle1' as table, spalte from table1 union all select 'tabelle2', spalte from table2 union all select 'tabelle3', spalte from table3) foo where spalte = 'das, was Du suchst';

So nach dem Weg.

Und ja: das ganze wird Dir, egal was Du vorhast, laut polternd und viel Schmerzen verursachend recht bald auf die Füße fallen. Unabhängig davon, ob Du das jetzt mir glaubst oder nicht. Glaub mir einfach ;-)
 
Vielen Dank erst mal für die ausführliche Antwort, kannst du mir eventuell dann eine andere Lösung empfehlen? Wie sollte man ansonsten solche Datensätze aufbauen ?
 
Die übliche Lösung, die auch mit MySQL geht, nennt sich EAV. Das war die letzten Wochen hier auch schon ab und an Thema.

Richtig elegant ginge es in PostgreSQL, indem man die Eigenschaften der einzelnen Dinge in einer JSONB-Spalte speichert und z.B. dort auf alle Keys = Modell einen Index legt. Abfragen wären dann absolut trivial - und schnell.
 
Mal als Demo:

Du hast diese Tabelle (Definition und Daten):

Code:
test=*# \d submap
  Table "public.submap"
  Column  |  Type  | Modifiers
---------------+---------+-----------
 id  | integer | not null
 produkt  | text  |
 eigenschaften | jsonb  |
Indexes:
  "submap_pkey" PRIMARY KEY, btree (id)
  "idx_submap" gin (eigenschaften jsonb_path_ops)

test=*# select * from submap ;
 id |  produkt  |  eigenschaften   
----+---------------+-----------------------------------------------------------------------------------------------
  1 | Bügeleisen  | {"Farbe": "rot", "Modell": "Holzkohle", "Gewicht": "12kg"}
  2 | Waschmaschine | {"Farbe": "grün", "Modell": "Dampfturbine", "Gewicht": "62kg", "Volumen": "50kg"}
  3 | Raumschiff  | {"Farbe": "silbergrün", "Modell": "Atomreaktor", "Passagiere": "20", "Startmasse": "50000kg"}
(3 rows)

test=*#

Wir suchen nun alles mit Modell = Holzkohle, ich zeige die einfache Abfrage und das Explain um zu zeigen, daß der Index genutzt wird:

Code:
test=*# select * from submap where eigenschaften @> '{"Modell": "Holzkohle"}';
 id |  produkt  |  eigenschaften   
----+------------+------------------------------------------------------------
  1 | Bügeleisen | {"Farbe": "rot", "Modell": "Holzkohle", "Gewicht": "12kg"}
(1 row)

test=*# explain analyse select * from submap where eigenschaften @> '{"Modell": "Holzkohle"}';
  QUERY PLAN   
-------------------------------------------------------------------------------------------------------------------
 Bitmap Heap Scan on submap  (cost=8.00..12.01 rows=1 width=68) (actual time=0.066..0.069 rows=1 loops=1)
  Recheck Cond: (eigenschaften @> '{"Modell": "Holzkohle"}'::jsonb)
  Heap Blocks: exact=1
  ->  Bitmap Index Scan on idx_submap  (cost=0.00..8.00 rows=1 width=0) (actual time=0.033..0.033 rows=1 loops=1)
  Index Cond: (eigenschaften @> '{"Modell": "Holzkohle"}'::jsonb)
 Planning time: 0.250 ms
 Execution time: 0.176 ms
(7 rows)

test=*#
 
Nachtrag: Eigenschaften, die alle Datensätze haben (sollten) sollten natürlich besser in dedizierten Spalten stehen, nur die spezifischen Eigenschaften je Datensatz kann/sollte man in JSONB speichern.
 
Werbung:
Um das eigentliche Problem nochmal zu eroieren, wie wäre es mit:
Code:
SELECT 'tabelle1' AS tabelle,t1.id FROM tabelle t1 WHERE t1.MODELL = 13 UNION ALL
SELECT 'tabelle2' AS tabelle,t2.id FROM tabelle t2 WHERE t2.MODELL = 13 UNION ALL
SELECT 'tabelle3' AS tabelle,t3.id FROM tabelle t3 WHERE t3.MODELL = 13 UNION ALL
SELECT 'tabelle4' AS tabelle,t4.id FROM tabelle t4 WHERE t4.MODELL = 13
Es können natürlich nur identische Spalten angezeigt werden, der Rest muss anderweitig in eine Textspalte oder ähnliches übegeben werden.
 
Zurück
Oben