Verflixte MySQL Abfrage

Bernie110

Benutzer
Beiträge
5
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
 
Werbung:
Ich möchte Daten von einem DBGrid2 zu einem anderen DbGrid1 überspielen/verschieben ( Mittels insert )

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=*#
 
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
 
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
 
na, wäre gut, wenn Du Tabelle und Daten für Dein Beispiel NACHVOLLZIEHBAR als SQL-Statement zeigen könntest ...

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.

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)

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

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)

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


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ß...
 
Werbung:
Zurück
Oben