Ankündigung

Einklappen
Keine Ankündigung bisher.

Tabellen Abfragen, die in anderer Tabelle gespeichert sind

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Tabellen Abfragen, die in anderer Tabelle gespeichert sind

    Hallo zusammen,

    ich möchte einen SQL Query formulieren, der nur diejenigen Tabellen Abfragen soll, die ich bereits in einer anderen Tabelle gespeichert habe.

    Beispiel: Habe in der Tabelle Produkte das Feld Produktkennung. Jedes Produkt hat einen eigenen Eintrag: Produkt1, Produkt2, Produkt3 etc.

    Jeder dieser Einträge ist aber auch eine eigene Tabelle. Nun möchte ich aber nur die Tabellen abfragen, die im Feld Produktkennung drinnen sind.

    Wie mache ich das?

    Vielen Dank!

  • #2
    Du verwechselst sehr häufig die Begriffe, so dass man nur ahnen kann, was Du vor hast.
    Ich gehe mal davon aus, dass WHERE und JOIN Dir weiter helfen, aber Du solltest zunächst mal zumindest Deine Versuche hier zeigen.

    btw. scheint das eher zu Datenbanken zu gehören.
    [MOD: verschoben von PHP-Einsteiger]
    Competence-Center -> Enjoy the Informatrix
    PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

    Kommentar


    • #3
      Ich sehe das wie Arne, entweder Du verwendest falsche Begriffe oder Du machst sehr eigenartige Sachen.
      Zeig doch mal das Table Create Script für Dein Problemfeld und ein paar Insert Statements mit Beispieldaten.
      Und so ungefähr das Statement, was Du eigentlich haben möchtest, soweit Du es hinbekommst.

      Kommentar


      • #4
        Ich hab euch ein Bild angehängt. Ihr seht, dass das die Inhalte des Feldes "MPN" auch jeweils eine eigene Tabelle ist.

        Nun möchte ich eben nur diejenigen Tabellen abfragen, die auch bei "MPN" gelistet sind.

        Das ganze soll eine Sicherheitsabfrage werden, sodass überprüft wird, in welchen der Tabellen der Datensatz der geändert wird, noch vorhanden ist.

        Das gedankliche Problem, bei dem ich nicht weiterkomme ist, dass ich ja bereits in der FROM Bedingung des Querys definiert haben müsste, dass die Tabellen von MPN abgefragt werden. Da komme ich einfach leider nicht weiter.

        Kommentar


        • #5
          Zitat von invers.square Beitrag anzeigen

          Beispiel: Habe in der Tabelle Produkte das Feld Produktkennung. Jedes Produkt hat einen eigenen Eintrag: Produkt1, Produkt2, Produkt3 etc.

          Jeder dieser Einträge ist aber auch eine eigene Tabelle. Nun möchte ich aber nur die Tabellen abfragen, die im Feld Produktkennung drinnen sind.

          Wie mache ich das?
          Neu und dann richtig.
          PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

          Kommentar


          • #6
            Eine Lösung könnte z.B. Partitioning sein. Um es mal zu zeigen:

            Code:
            test=*# create table produkte (kategorie text, name text, preis int) partition by list (kategorie);
            CREATE TABLE
            
            test=*# create table buecher partition of produkte for values in ('Buch');
            CREATE TABLE
            test=*# create table autos partition of produkte for values in ('Auto');
            CREATE TABLE
            test=*# create table getraenke partition of produkte for values in ('Getraenk');
            CREATE TABLE
            test=*# insert into produkte values ('Auto','Tesla',100000);
            INSERT 0 1
            test=*# insert into produkte values ('Buch','PostgreSQL 10 Administration Cookbook',45);
            INSERT 0 1
            test=*# insert into produkte values ('Getraenk','Radeberger',19);
            INSERT 0 1
            
            -- wir haben nun eine Tabelle produkte sowie autos, getraenke und buecher. Fragen wir die Haupttabelle ab, sehen wir alles:
            
            test=*# select * from produkte ;
            kategorie | name | preis
            -----------+---------------------------------------+--------
            Auto | Tesla | 100000
            Buch | PostgreSQL 10 Administration Cookbook | 45
            Getraenk | Radeberger | 19
            (3 rows)
            
            
            -- fragen wir nur autos ab, sehen wir nur Autos
            
            test=*# select * from only autos;
            kategorie | name | preis
            -----------+-------+--------
            Auto | Tesla | 100000
            (1 row)
            
            -- fragen wir die Haupttabelle nach der Kategorie 'Auto' ab, wird nur die entsprechende Untertabelle abgefragt:
            -- dazu zeige ich mal das EXPLAIN ANALYSE
            
            
            test=*# explain analyse select * from produkte where kategorie = 'Auto';
            QUERY PLAN
            -------------------------------------------------------------------------------------------------------
            Append (cost=0.00..20.64 rows=4 width=68) (actual time=0.013..0.015 rows=1 loops=1)
            -> Seq Scan on autos (cost=0.00..20.62 rows=4 width=68) (actual time=0.012..0.013 rows=1 loops=1)
            Filter: (kategorie = 'Auto'::text)
            Planning Time: 0.339 ms
            Execution Time: 0.042 ms
            (5 rows)
            Das wäre ein Ansatz, der dann auch skaliert. Dein Ansatz ist einfach nur für die Tonne.
            PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

            Kommentar


            • #7
              Das Bild bestätigt meine Befürchtung. Ich zitiere mich mal selbst:
              Zitat von Perry Staltic Beitrag anzeigen
              ..entweder.. oder Du machst sehr eigenartige Sachen.
              Was Du da gebaut hast, ist mehr oder weniger ein No Go. Solche Konstruktionen sind möglich, weil eben nicht verboten, aber sie sind das Gegenteil von Best Practice, also Worst Practice.

              Was Dir ja im Grunde auch aufgefallen zu sein scheint, denn Du schaffst es mit solchen Tabellen nicht einmal, normale SQL Statements zu nutzen.

              Wie auch immer, akretschmer hat einen Lösungsansatz gezeigt, ansonsten fällt mir nur ein, dass Du alle SQL Statements dynamisch generieren/konstruieren musst.
              Es gibt Datenbanken, die dafür selbst Funktionen bereitstellen oder Du machst das mit einem extra Werkzeug (PHP, ..).

              Und nochmal, sowas macht man normalerweise nicht und Du hast auch keinen Grund genannt, warum Du es machst / machen musst.

              Kommentar


              • #8
                Alternativ geht auch die Ausnutzung von Inheritance. Kleines Beispiel:

                Code:
                test=# create table oberprodukte (kategorie text, name text, preis text);
                CREATE TABLE
                
                test=*# create table auto (like oberprodukte);
                CREATE TABLE
                test=*# create table buch (like oberprodukte);
                CREATE TABLE
                
                -- jetzt haben wir 3 Tabellen mit identischen Aufbau
                -- buch und auto sollen nun als vererbt von oberprodukte deklariert werden
                
                test=*# alter table auto inherit oberprodukte;
                ALTER TABLE
                test=*# alter table buch inherit oberprodukte;
                ALTER TABLE
                
                -- nun inserte ich was in die Untertabellen
                
                test=*# insert into auto values ('Auto','Opel', 30000);
                INSERT 0 1
                test=*# insert into buch values ('Buch','ein Buch halt', 14);
                INSERT 0 1
                
                -- frage ich nun oberprodukte ab, sehe ich alle Inhalte
                
                test=*# select * from oberprodukte ;
                 kategorie |     name      | preis
                -----------+---------------+-------
                 Auto      | Opel          | 30000
                 Buch      | ein Buch halt | 14
                (2 rows)
                Das ist der Weg, wie Partitionierung in PostgreSQL seit zig Jahren funktioniert. Das ist aber noch unvollständig, da fehlen noch die Constraints auf den Untertabellen, damit constraint exclusion beim Selekt wirken kann, sowie TRIGGER auf der Obertabelle, welcher bei Insert in diese die Daten in die korrekten Kindtabellen routet.

                Seit Version 10 kann PG deklarative Partitionierung (wie gezeigt), allerdings fehlen da noch eine Reihe von Features - diese sind nun quasi zu 100% in Version 11, welche seit ca. 1 Woche verfügbar ist.

                tl;dr

                der Fragestelle möge seinen Müll entsorgen, das geht so gegen die Wand. Man könnte, wie schon vom Vorredner gesagt, noch dynamisch ein SQL zusammenschustern, aber das würde das vorhandene Desaster nur unsinnig zementieren.
                PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                Kommentar


                • #9
                  Zitat von akretschmer Beitrag anzeigen
                  ..
                  der Fragestelle möge seinen Müll entsorgen, das geht so gegen die Wand. Man könnte, wie schon vom Vorredner gesagt, noch dynamisch ein SQL zusammenschustern, aber das würde das vorhandene Desaster nur unsinnig zementieren.
                  Ich habe betont, dass das aktuelle "Müll" Modell keinen guten Eindruck macht.
                  Aber wir kennen auch nicht die Gründe, warum das so gemacht wurde.
                  Wie gesagt, dynamisches SQL wäre ein weitere Möglichkeit, mit dem Status Quo umzugehen. Ob es sinnvoll ist, kann man ohne weiteres nicht sagen.

                  Kommentar


                  • #10
                    btw: da die Zeitpunkte der einzelnen Postings immer eine Stunde in der Zukunft liegen, vermute ich, die Admins hier haben die Zeitumstellung verpennt.

                    *klingel* *klingel* *klingel*


                    PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                    Kommentar


                    • hoefti
                      hoefti kommentierte
                      Kommentar bearbeiten
                      Heute erledigt, der Sonntag ist heilig

                  • #11
                    Lass die doch erstmal ausschlafen...
                    hoefti, kannst Du bitte mal dran drehen...
                    Competence-Center -> Enjoy the Informatrix
                    PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                    Kommentar


                    • Arne Drews
                      Arne Drews kommentierte
                      Kommentar bearbeiten
                      Obwohl... Bei mir passt es gerade. Wurde schon angepasst?
                  Lädt...
                  X