1. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

Verflixte MySQL Abfrage

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von Bernie110, 13 Mai 2020.

  1. Bernie110

    Bernie110 Benutzer

    Hallo Zusamen,

    ich bin neu hier und hoffe, dass mir jemand helfen kann.
    Ich versuche seit Tagen verzeifelt eine MySQl Abfrage zuerstellen.
    Bekomme aber einfach nicht das gewünschte Ergebnis .

    Zur Information :
    ---------------------

    Ich möchte Daten von einem DBGrid2 zu einem anderen DbGrid1 überspielen/verschieben ( Mittels insert )
    Hintergund _ Ich möchte Konaktdaten ( Ansprechpartner) mehren Adressen zuweisen.

    Dafür habe ich folgende Tabellen :

    STAMM_ADRESSEN_KONTAKT_VERKN_TBL
    (
    KONT_VERKN_ID int primary key auto_increment,
    XADRESS_ID INT,
    XUSER_ID Integer,
    X_ADR_USER_Verkn_Index VarChar(45)

    STAMM_ADRESSEN_HAUPTGUPPE
    ID = PK
    ADRESS_ID = Integer

    STAMM_ADRESSEN
    ID PK
    FirmenName1 = Varchar(30)
    usw.

    STAMM_ADRESSEN_HAUPTGRUPPE_VERKNUEPF_TBL
    VERKN_ID int primary key auto_increment,
    Firmen_HG_ID Integer; = PK aus STAMM_ADRESSEN_HAUPTGUPPE
    ADRESS_ID Integer = PK aus STAMM_ADRESSEN

    VIEW v_STAMM_ADRESSEN_HAUPTGRUPPE AS
    select
    hg.Firmen_HG_ID,
    hg.Firmen_HG_Name,
    hg.Firmen_HG_Beschreibung1,
    hg.Firmen_HG_Beschreibung2,
    a.*
    from
    stamm_Adressen a, STAMM_ADRESSEN_HAUPTGRUPPE_VERKNUEPF_TBL hgvk, STAMM_ADRESSEN_HAUPTGRUPPE hg
    where
    hgvk.Adress_Id = a.ID and hg.Firmen_HG_ID = hgvk.Firmen_HG_ID and a.aktiv = 1
    order by a.ID;

    CREATE VIEW v_STAMM_ADRESSEN_KONTAKT AS (diese view befüllt DBGRID1)
    SELECT
    x.KONT_VERKN_ID,
    x.XADRESS_ID,
    k.*,
    a.FirmenName1,
    a.FirmenName2,
    a.Strasse1,
    a.Strasse2,
    a.Land,
    a.Plz,
    a.Ort,
    a.Tel as Firma_Tel

    FROM
    STAMM_ADRESSEN_KONTAKT_VERKN_TBL x, STAMM_ADRESSEN a, STAMM_ADRESSEN_KONTAKT k

    WHERE x.XADRESS_ID = a.ID and x.XUSER_ID = k.Kontakt_ID and k.Aktiv = 1
    ORDER BY
    Kontakt_ID;


    Das hier ist mein Versuch das DBGrid2 nach Selektierung zubefüllen und die
    selectieren Daten verschwinden zulassen.


    s := 'SELECT '
    + ' E.Kontakt_ID,'
    + ' P.*'
    + ' FROM'
    + ' v_stamm_adressen_hauptgruppe P'
    + ' LEFT OUTER JOIN v_stamm_adressen_kontakt E ON'
    + ' E.XADRESS_ID = P.ID'
    + ' WHERE'
    + ' E.XADRESS_ID IS NULL and P.Firmen_HG_ID = '''+Firmen_HG_ID.text+''' ';

    SQLQuery2.close;
    SQLQuery2.SQL.Clear;
    SQLQuery2.SQL.Add(s);
    SQLQuery2.open;
    DBGrid2.refresh;


    Das funktioniert nur mit einem Konakt einer Firma.
    Heisst. Für jeden weiteren Konakt der gleichen Firma bleiben nur die nicht selektieren Firmen überig.
    Ich möchte aber bei jedem weiterem Konakt, dass alle Firmen wieder angezeigt werden :-(
    Vll wäre es besser wenn man eine Zischentabelle befüllt. So könnte ich mir zumindestens etwas behelfen.
    Ein funktionirendes SQL Statement wäre aber wohl die bessere Wahl.

    Hört sich wohl alles ziemlich konfuse an ich weiss:
    Wäre schön wenn ihr mir sagen würdet wie ich es besser beschreiben soll/kann
    Bin für jede Antwort dankbar !
    Lg Bernie
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Keine Ahnung was Du mit DBGrid meinst, aber wenn ich Daten von einer Source-Tabelle in eine Destination-Tabelle verschieben will mache ich das so:

    Code:
    test=*# create table source(id serial primary key, val text);
    CREATE TABLE
    test=*# create table destination(id serial primary key, val text);
    CREATE TABLE
    test=*# insert into source (val) select 'line ' || s::text from generate_series(1,10) s;
    INSERT 0 10
    test=*# with move as (delete from source where id between 3 and 7 returning *) insert into destination select * from move;
    INSERT 0 5
    test=*# select * from source;
     id |   val   
    ----+---------
      1 | line 1
      2 | line 2
      8 | line 8
      9 | line 9
     10 | line 10
    (5 rows)
    
    test=*# select * from destination;
     id |  val   
    ----+--------
      3 | line 3
      4 | line 4
      5 | line 5
      6 | line 6
      7 | line 7
    (5 rows)
    
    test=*#
    
     
  3. Bernie110

    Bernie110 Benutzer

    Hallo
    akretschmer danke für deine Antrwort.
    DBGrid ist ein Delphi/Lazarus Objekt. Eine Tabelle in der die Daten auf dem Form stehen, Sorry .
    Ja so ähnlich würde ich das auch gerne machen wollen. Nur leider ist mein Source keine Tabelle aus der ich Daten löschen kann.
    Würdest du dann dafür eine temporäre Tabelle anlegen ??
    Lg Bernie
     
  4. akretschmer

    akretschmer Datenbank-Guru

    Wozu? Um darin zu löschen? Ich nicht Delphi, möglicherweise falsches Forum.
     
  5. Bernie110

    Bernie110 Benutzer

    Genau. Ich finde ja keine Lösung um meine Daten vernüftig zu selektieren.

    oder mal etwas einfacher. Wie würdest du das machen.

    Tbl_Kontakte
    ----------------------------------------
    Kontakt_ID / Name

    1 Max Mustermann
    2 John Doe
    3 Michael Schuhmacher
    4 Bertram Holler

    Tbl Firmen
    ----------------------------------------
    Firmen_ID FirmenName FirmenGuppen_ID
    1. Mustermann Gmbh Hamburg 1
    2, Mustermann Gmbh Freiburg 1
    3. Mustermann GmbH Berlin 1
    4. Mustermann GmbH München 1
    5. Mustermann Gmbh Stuttgart. 1
    6. Siemens Erlangen 2


    Die Kontakt Tabelle hat eine Verknüpfungstabelle in die geschrieben werden soll.

    Tbl_Kontakte_Verkn
    ID -PK / Kontakt_ID / Firmen_ID / FirmenGruppen_ID
    1 1 1 1
    2 1 2 1
    3 1 3 1 (Max Mustermann ist der Firma Mustermann-Hamburg Freiburg und Berlin zugeortnet)

    Jetzt möchte ich ID 2 John Doe der Firma 1 Mustermann Hamburg und Freiburg und München zuordnen.
    Bevor ich das mache.. sollen aber nochmals alle Firmen mit der FirmenGruppen_ID 1 angezeigt werden.

    Die Auswahltabelle soll erneut so aussehen :
    1. Mustermann Gmbh Hamburg 1
    2, Mustermann Gmbh Freiburg 1
    3. Mustermann GmbH Berlin 1
    4. Mustermann GmbH München 1
    5. Mustermann Gmbh Stuttgart. 1

    Ergebins sollte dann nach Zuordnung so aussehn :

    Tbl_Kontakte_Verkn
    ID -PK / Kontakt_ID / Firmen_ID / FirmenGruppen_ID
    1 1 1 1
    2 1 2 1
    3 1 3 1
    4 2 1 1
    5 2 2 1
    6 2 4 1


    Die Auswahltabelle zeigt die nicht zugeordenten Firmean an. :
    3. Mustermann GmbH Berlin 1
    5. Mustermann Gmbh Stuttgart. 1

    Also jeder Kontakt sollte in der Auswahltablle seinen jeweiligen Firmane angezeigt bekommen, welche ihm nicht zugeordent sind.
    Dabei sollen die Firmendaten in dieser Tabelle weder gelöscht noch verdoppelt werden.

    Wie würdest du bzw Ihr es machen ? -
    Lg Bernie
     
  6. akretschmer

    akretschmer Datenbank-Guru

    Nachvollziehbar. So daß man via Copy&Paste es nachcollziehen kann.
     
  7. Bernie110

    Bernie110 Benutzer

    Sehr gute Antwort. Wäre super wenn du mir es dann auch noch zeigen würdest wie es geht. ;-)
     
  8. akretschmer

    akretschmer Datenbank-Guru

    na, wäre gut, wenn Du Tabelle und Daten für Dein Beispiel NACHVOLLZIEHBAR als SQL-Statement zeigen könntest ...

    Code:
    test=*# select * from firmen ;
     id |    name     | gruppe
    ----+-------------+--------
      1 | m hamburg   |      1
      2 | m freiburg  |      1
      3 | m berlin    |      1
      4 | m münchen   |      1
      5 | m stuttgart |      1
      6 | siemens     |      2
    (6 rows)
    
    test=*# select * from kontakte_verkn ;
     id | kid | fid | gruppe
    ----+-----+-----+--------
      1 |   1 |   1 |      1
      2 |   1 |   2 |      1
      3 |   1 |   3 |      1
    (3 rows)
    
    test=*# select * from kontakte;
     id |        name       
    ----+--------------------
      1 | max mustermann
      2 | john doe
      3 | michael schumacher
      4 | bertram holler
    (4 rows)
    
    
    Code:
    test=*# with k as (select * from kontakte where id = 2), f as (select * from k left join kontakte_verkn kv on k.id=kv.kid) select * from firmen where id not in (select coalesce(fid,0) from f) and gruppe = 1;
     id |    name     | gruppe
    ----+-------------+--------
      1 | m hamburg   |      1
      2 | m freiburg  |      1
      3 | m berlin    |      1
      4 | m münchen   |      1
      5 | m stuttgart |      1
    (5 rows)
    

    Code:
    test=*# select * from kontakte_verkn ;
     id | kid | fid | gruppe
    ----+-----+-----+--------
      1 |   1 |   1 |      1
      2 |   1 |   2 |      1
      3 |   1 |   3 |      1
      4 |   2 |   1 |      1
      5 |   2 |   2 |      1
      6 |   2 |   4 |      1
    (6 rows)
    
    test=*# with k as (select * from kontakte where id = 2), f as (select * from k left join kontakte_verkn kv on k.id=kv.kid) select * from firmen where id not in (select coalesce(fid,0) from f) and gruppe = 1;
     id |    name     | gruppe
    ----+-------------+--------
      3 | m berlin    |      1
      5 | m stuttgart |      1
    (2 rows)
    
    mal so als Schnellschuß...
     
  9. Bernie110

    Bernie110 Benutzer

    Hi herzlichen Dank !

    genau darum gehts. Jetzt versuche ich das mal auf MySql zuübersetzen :D
    Mal sehen ob ich das hinbekomme
    Lg Bernie
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden