Announcement

Collapse
No announcement yet.

2 Select Abfragen zu einer zusammenführen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • 2 Select Abfragen zu einer zusammenführen

    Hallo,

    Ich habe zwei Tabellen in PostgreSQL 9.3
    Eine Tabelle für Bestellungen
    und Eine Tabelle für Katalog Einträge

    In der Katalog Tabelle werden alle Artikel gespeichert die in der Datenbank weitere Verwendung finden zb. Lagerstand oder Werkzeugverwaltung

    Die Tabelle Bestellung dient zur Festhaltung von Bestellungen
    zum Ersten werden hier einfache Bestellungen direkt Eingetragen mit Artikel-,Bestellnummer, Lieferant usw.
    zum Zweiten Bestellungen Direkt aus dem Katalog wo dann nur die Katalog ID hinterlegt wird.

    Die Abfrage der Tabelle Bestellung wird im Moment über Zwei Querys gelöst die Erste dient dazu um festzustellen ob die Katalog>0 ist
    wenn ja wird die Zweite Abfrage für die Tabelle katalog gestartet
    bei nein wird die Tabelle Bestellung noch einmal abgefragt um die Restlichen Daten zu erhalten

    kann ich dies auch über eine Abfrage Lösen? wenn ja wie?

    mfg Peter


    Code:
    -- Table: bestellung
    
    -- DROP TABLE bestellung;
    
    CREATE TABLE bestellung
    (
      bestellung_id bigserial NOT NULL,
      menge numeric(10,0),
      einheit_id bigint,
      katalog_id bigint,
      bezeichnung_id bigint,
      bezeichnung character varying(40),
      artikel character varying(30),
      bestell character varying(30),
      hersteller_id bigint,
      lieferant_id bigint,
      kostenstelle_id bigint,
      bemerkung character varying(250),
      liefermenge numeric(10,3),
      datum date,
      gedruckt integer,
      lieferungkomplett integer,
      bestellnummer character varying(10), -- 10
      CONSTRAINT primary_bestellung PRIMARY KEY (bestellung_id)
    )
    WITH (
      OIDS=FALSE
    );
    ALTER TABLE bestellung
      OWNER TO postgres;
    COMMENT ON COLUMN bestellung.bestellnummer IS '10';

    Code:
    -- Table: katalog
    
    -- DROP TABLE katalog;
    
    CREATE TABLE katalog
    (
      katalog_id bigserial NOT NULL,
      bezeichnung_id bigint,
      bezeichnung character varying(40),
      artikel character varying(30),
      bestell character varying(30),
      hersteller_id bigint,
      lieferant_id bigint,
      kategorie_id bigint,
      unterkategorie_id bigint,
      bestellmenge numeric(10,0),
      einheit_id bigint,
      kostenstelle_id bigint,
      bemerkung character varying(250),
      bild character varying(35),
      CONSTRAINT primary_katalog PRIMARY KEY (katalog_id),
      CONSTRAINT unique_artikel_bestell UNIQUE (artikel, bestell)
    )
    WITH (
      OIDS=FALSE
    );
    ALTER TABLE katalog
      OWNER TO postgres;

  • #2
    Falls das noch aktuell ist und nichts mit der anderen Frage zu tun hat:
    Du kannst ganz verschiedene Mengen über "Union" kombinieren. Und damit kommt man gleich zur Hauptfrage:
    Welche Felder brauchst Du aus den beiden Tabellen?
    Eine Abfrage bedeutet natürlich auch nur ein Set an Feldern, das ausgegeben wird. Da musst Du schon sagen, was Du haben willst, dann kann man das vermutlich erweitern.
    Gruß, defo

    Comment


    • #3
      Hallo,

      Ja diese ist noch Aktuell
      hier auch noch der Code in Python mit der SQL Abfrage

      [highlight=python]
      def func_bestellungen_offen(self):
      self.lbl_anzeige.setText("Offen")
      SQL_Statement="""SELECT
      bestellung.bestellung_id,
      bestellung.menge,
      einheit.einheit,
      kostenstelle.kostenstelle,
      bestellung.katalog_id,
      bestellung.datum
      FROM
      bestellung
      LEFT JOIN
      einheit
      ON
      einheit.einheit_id=bestellung.einheit_id
      LEFT JOIN
      kostenstelle
      ON
      kostenstelle.kostenstelle_id=bestellung.kostenstel le_id
      WHERE
      gedruckt=1 AND lieferungkomplett=0
      ORDER BY bestellung.datum
      """
      SQL_Result_Bestellung=db.DBConnect(SQL_Statement)
      self.tbl_bestellungen.setRowCount(len(SQL_Result_B estellung))
      Zaehler=0
      for Row_Bestellung in SQL_Result_Bestellung:
      self.tbl_bestellungen.setItem(Zaehler,0,QTableWidg etItem(str(Row_Bestellung[0])))
      self.tbl_bestellungen.setItem(Zaehler,2,QTableWidg etItem(str(Row_Bestellung[1])))
      self.tbl_bestellungen.setItem(Zaehler,3,QTableWidg etItem(str(Row_Bestellung[2])))
      self.tbl_bestellungen.setItem(Zaehler,10,QTableWid getItem(str(Row_Bestellung[3])))
      self.tbl_bestellungen.setItem(Zaehler,1,QTableWidg etItem(str(Row_Bestellung[5].toString('dd.MM.yyyy'))))

      Bestellung_ID=Row_Bestellung[0]
      Katalog_ID=Row_Bestellung[4]

      if Katalog_ID>0:
      SQL_Statement="""SELECT bezeichnung.bezeichnung,
      katalog.bezeichnung as alternativ,
      katalog.artikel,
      katalog.bestell,
      hersteller.lieferant,
      lieferant.lieferant
      FROM
      katalog
      LEFT JOIN
      bezeichnung
      ON
      bezeichnung.bezeichnung_id=katalog.bezeichnung_id
      LEFT JOIN
      lieferant hersteller
      ON
      hersteller.lieferant_id=katalog.hersteller_id
      LEFT JOIN
      lieferant
      ON
      lieferant.lieferant_id=katalog.lieferant_id
      WHERE
      katalog.katalog_id=""" + str(Katalog_ID)
      else:
      SQL_Statement="""SELECT bezeichnung.bezeichnung,
      bestellung.bezeichnung as alternativ,
      bestellung.artikel,
      bestellung.bestell,
      hersteller.lieferant,
      lieferant.lieferant
      FROM
      bestellung
      LEFT JOIN
      bezeichnung
      ON
      bezeichnung.bezeichnung_id=bestellung.bezeichnung_ id
      LEFT JOIN
      lieferant hersteller
      ON
      hersteller.lieferant_id=bestellung.hersteller_id
      LEFT JOIN
      lieferant
      ON
      lieferant.lieferant_id=bestellung.lieferant_id
      WHERE
      bestellung.bestellung_id=""" + str(Bestellung_ID)
      SQL_Result_Katalog=db.DBConnect(SQL_Statement)
      for Row_Katalog in SQL_Result_Katalog:
      self.tbl_bestellungen.setItem(Zaehler,4,QTableWidg etItem(str(Row_Katalog[0])))
      self.tbl_bestellungen.setItem(Zaehler,5,QTableWidg etItem(str(Row_Katalog[1])))
      self.tbl_bestellungen.setItem(Zaehler,6,QTableWidg etItem(str(Row_Katalog[2])))
      self.tbl_bestellungen.setItem(Zaehler,7,QTableWidg etItem(str(Row_Katalog[3])))
      self.tbl_bestellungen.setItem(Zaehler,8,QTableWidg etItem(str(Row_Katalog[4])))
      self.tbl_bestellungen.setItem(Zaehler,9,QTableWidg etItem(str(Row_Katalog[5])))

      Zaehler = Zaehler + 1
      self.lbl_menge.setText(str(self.tbl_bestellungen.r owCount()))


      [/highlight]

      Jetzt Bitte nicht am Python Code Stören wird umgebaut gleichsam mit der SQL Abfrage.

      Als erstes wird eine Abfrage in der Tabelle bestellung ausgeführt um mal die nur darin enthaltenen Spalten zu erhalten
      danach wird die Katalog_ID geprüft ob diese größer als null ist wenn ja dann wird eine Abfrage in der Katalog Tabelle ausgeführt um die restlichen Daten zu erhalten
      wenn die Katalog_ID 0 ist dann wird die gleiche Abfrage auf die Tabelle bestellung ausgeführt.

      dies sollte ja dann ungefähr so aussehen?
      [highlight=sql]
      SELECT
      bestellung.bestellung_id,
      bestellung.menge,
      einheit.einheit,
      kostenstelle.kostenstelle,
      bestellung.katalog_id,
      bestellung.datum,

      bezeichnung.bezeichnung,
      bestellung.bezeichnung as alternativ,
      bestellung.artikel,
      bestellung.bestell,
      hersteller.lieferant,
      lieferant.lieferant
      FROM
      bestellung
      UNION
      SELECT
      bezeichnung.bezeichnung,
      bestellung.bezeichnung as alternativ,
      bestellung.artikel,
      bestellung.bestell,
      hersteller.lieferant,
      lieferant.lieferant
      FROM
      katalog
      WHERE bestellung.katalog_id=katalog.katalog_id
      LEFT JOIN
      einheit
      ON
      einheit.einheit_id=bestellung.einheit_id
      LEFT JOIN
      kostenstelle
      ON
      kostenstelle.kostenstelle_id=bestellung.kostenstel le_id
      WHERE
      gedruckt=1 AND lieferungkomplett=0
      ORDER BY bestellung.datum
      [/highlight]


      mfg Peter

      Comment


      • #4
        Originally posted by Lucifer21 View Post
        Hallo,

        Ja diese ist noch Aktuell
        SQL in Schleifen ist fast immer ein Fehler. Zeig doch mal bitte anhand vereinfachter Beispieltabellen, was Du hast und was Du willst. Mir ist das jetzt erst einmal tl;dr. Und bitte ohne Quark in fremden Sprachen, rein SQL.

        Comment


        • #5
          Das SQL Statement für die Union steht da quasi schon, es fehlt hauptsächlich das "union"
          Originally posted by Lucifer21 View Post
          [highlight=sql]
          SELECT bezeichnung.bezeichnung,
          katalog.bezeichnung as alternativ,
          katalog.artikel,
          katalog.bestell,
          hersteller.lieferant,
          lieferant.lieferant
          FROM katalog LEFT JOIN bezeichnung
          ON bezeichnung.bezeichnung_id=katalog.bezeichnung_id
          LEFT JOIN lieferant hersteller
          ON hersteller.lieferant_id=katalog.hersteller_id
          LEFT JOIN lieferant
          ON lieferant.lieferant_id=katalog.lieferant_id
          WHERE
          katalog.katalog_id= + str(Katalog_ID) /*!!!*/
          union /*!!!*/
          SELECT bezeichnung.bezeichnung,
          bestellung.bezeichnung as alternativ,
          bestellung.artikel,
          bestellung.bestell,
          hersteller.lieferant,
          lieferant.lieferant
          FROM bestellung LEFT JOIN bezeichnung
          ON bezeichnung.bezeichnung_id=bestellung.bezeichnung_ id
          LEFT JOIN lieferant hersteller
          ON hersteller.lieferant_id=bestellung.hersteller_id
          LEFT JOIN lieferant
          ON lieferant.lieferant_id=bestellung.lieferant_id
          WHERE
          bestellung.bestellung_id= + str(Bestellung_ID) /*!!!*/
          [/highlight]
          So würde ein Union draus werden


          Das hier ist falsch:
          Originally posted by Lucifer21 View Post
          [highlight=sql]
          SELECT
          bestellung.bestellung_id,
          bestellung.menge,
          einheit.einheit,
          kostenstelle.kostenstelle,
          bestellung.katalog_id,
          bestellung.datum,

          bezeichnung.bezeichnung,
          bestellung.bezeichnung as alternativ,
          bestellung.artikel,
          bestellung.bestell,
          hersteller.lieferant,
          lieferant.lieferant
          FROM
          bestellung
          UNION
          SELECT
          bezeichnung.bezeichnung,
          bestellung.bezeichnung as alternativ,
          bestellung.artikel,
          bestellung.bestell,
          hersteller.lieferant,
          lieferant.lieferant
          FROM
          katalog
          WHERE bestellung.katalog_id=katalog.katalog_id
          LEFT JOIN
          einheit
          ON
          einheit.einheit_id=bestellung.einheit_id
          LEFT JOIN
          kostenstelle
          ON
          kostenstelle.kostenstelle_id=bestellung.kostenstel le_id
          WHERE
          gedruckt=1 AND lieferungkomplett=0
          ORDER BY bestellung.datum
          [/highlight]
          Ein union setzt identische Ausgabe-Strukturen voraus.

          Im ersten Teil (der ursprünglich mit Python versehen war) fehlen natürlich noch die Spalten mit den ID aus Katalog bzw. Bestellung. Und die Parameter mittendrin gehören da so natürlich auch nicht hin. Aber so in der Art könnte es aussehen.
          Aber:
          Wieso willst Du das umbauen. Ein Katalog auch wenn er groß ist, ist sicher schnell durchsucht, eine Bestelltabelle kann riesig sein, da mach ich nicht unbedingt zum Spaß Union drauf und such wahllos nach einer Nummer, weil jemand die Idee hatte, "der soll automatisch nach beidem suchen".
          Aber wirst Du schon merken, vielleicht erst nach und nach, wenn es mehr Bestellungen werden.

          Was die ID angeht: Ist sichergestellt, dass die sich nicht überschneiden bei Bestellung und Katalog?
          Gruß, defo

          Comment


          • #6
            Hallo,

            Danke erst einmal.

            Wieso willst Du das umbauen. Ein Katalog auch wenn er groß ist, ist sicher schnell durchsucht, eine Bestelltabelle kann riesig sein, da mach ich nicht unbedingt zum Spaß Union drauf und such wahllos nach einer Nummer, weil jemand die Idee hatte, "der soll automatisch nach beidem suchen".
            Aber wirst Du schon merken, vielleicht erst nach und nach, wenn es mehr Bestellungen werden.
            Der Grund ist im Katalog habe ich nur Artikel stehen die auch wo anders in der Datenbank benötigt werden
            zb. in der Lagerstand Tabelle, Werkzeug Ersatzteil Tabelle, Standard Bestellartikel

            Diese Katalog Artikel werden nur mittels Katalog_ID in der Bestelltabelle Eingetragen.

            Dann habe ich Artikel die ich Bestellen muss aber die ich nicht im Katalog habe da deren Bestellhäufigkeit nur 1mal ist und ich diese Artikel auch nicht im Katalog benötige.
            Diese werden Komplett in der Tabelle Bestellung gespeichert.


            Bei einer Anzeige der Tabelle Bestellungen können dann natürlich beide Situationen Auftreten
            eine komplette anzeige ist zwar möglich aber häufig werden nur die Nicht Gedruckten oder die Offenen Bestellungen angezeigt.

            Was die ID angeht: Ist sichergestellt, dass die sich nicht überschneiden bei Bestellung und Katalog?
            Welche ID?

            Die Katalog_ID kann öfters in der Tabelle Bestellung vorkommen
            die Bestell_ID wird automatisch vergeben und kommt nur einmal vor



            mfg Peter

            Comment

            Working...
            X