PDA

View Full Version : SQL CREATE VIEW komplexes Problem



bettina_martin
11-02-10, 13:20
hi,

ich habe folgendes Problem mit einem SQL CREATE VIEW bzw. will ich wissen ob folgendes möglich ist:

Ich hab 3 physische Datein:

A
B
C

Tabelle A ist der Kundenstamm mit der Kundennummer die UNIQUE ist, d.h. ein Satz pro Kundennr.

Tabelle B und C sind Tabellen mit Telefonnummer(B) und Email-Adr.(C) zum Kunden, auch mit Kundennr.
Hat der Kunde als z.b. 2 Tel.nummern, dann gibt es in Tabelle B 2 Sätze !!!

Jetzt muss ich mit Create View im SQL eine Datei erzeugen, wo ich pro Kunde nur EINEN Satz erzeugen darf !

Kundennr. (tab A)
name (tab A)
Tel.nummer 1 (tab B)
Tel.nummer 2 (tab B)
Tel.nummer 3 (tab B)
Email 1 (tab C)
Email 2 (tab C)
Email 3 (tab C)

Ist das mit einem CREATE VIEW möglich ? Ich kann hier NUR mit einem create view arbeiten !!! Ich kann hier nichts reinprogrammieren mit irgendwas, die Gründe wären jetzt zu komplex zu erklären.

Könnt ihr mir helfen ?

lg, Martin

andreaspr@aon.at
11-02-10, 13:41
hi martin,

brauchst du den einen DS für eine ausgabe ins CSV?
denn dann könntest du - wie schon ein paar mal im forum beschrieben - eine zeichenkette in einer schleife zusammenstellen.

je nach dem wie extrem die lösung sein soll, könntest du auch folgendes machen:
dynamisches create table mit dynamische zusammensetzung der spalten. (spaltendefinitionen kriegst du aus der tabelle syscolumns)
dynamisches insert aus tabelle a, b und c in die neue.

aber wie gesagt ... das ist sicher NICHT die schöne lösung ;)

lg andreas

bettina_martin
11-02-10, 13:44
hi martin,

brauchst du den einen DS für eine ausgabe ins CSV?
denn dann könntest du - wie schon ein paar mal im forum beschrieben - eine zeichenkette in einer schleife zusammenstellen.

je nach dem wie extrem die lösung sein soll, könntest du auch folgendes machen:
dynamisches create table mit dynamische zusammensetzung der spalten. (spaltendefinitionen kriegst du aus der tabelle syscolumns)
dynamisches insert aus tabelle a, b und c in die neue.

aber wie gesagt ... das ist sicher NICHT die schöne lösung ;)

lg andreas

nein, das problem ist ein anderes.

System A ist ein SAP was auf einer AS/400 läuft. Tabelle A B und C ist dort abgelegt.

System B ist ein Warenwirtschaftsprogramm, welches auf einer anderen AS/400 läuft. Dieses muss ECHTZEIT auf diesen View zugreifen !

Im Moment greift dieser nur auf Tabelle A zu. Das war einfach. Jetzt kommen B und C dazu um auch Tel.nr. und Email-Adr. zu haben. Jetzt wirds kompliziert.

Im System B darf ich nur einen Record pro Kundennummer haben, das hat 'entwicklungstechnische' Gründe.

Also ein bisschen kompliziert das ganze :)

lg

andreaspr@aon.at
11-02-10, 14:00
also, was du gerne hättest wäre ein view, welches die spalten automatisch hinzufügt bzw. entfernt, je nachdem wieviele datensätze in tabelle b und c vorhanden sind?
bzw. je nachdem zb wieviele spalten für telefonnummern in b zur aktuellen abfrage benötigt werden?

also ich glaube ich lehne mich da nicht zuweit aus dem fenster, wenn ich sage sowas geht nicht.

wenn dein warenwirtschaftsprogramm auch über sql auf dieses view zugreift, woher weis dieses wieviele spalten gerade vorhanden sind, bzw. welche spalte telefon und welche mails sind?

lg andreas

bettina_martin
11-02-10, 14:05
also, was du gerne hättest wäre ein view, welches die spalten automatisch hinzufügt bzw. entfernt, je nachdem wieviele datensätze in tabelle b und c vorhanden sind?
bzw. je nachdem zb wieviele spalten für telefonnummern in b zur aktuellen abfrage benötigt werden?

also ich glaube ich lehne mich da nicht zuweit aus dem fenster, wenn ich sage sowas geht nicht.

wenn dein warenwirtschaftsprogramm auch über sql auf dieses view zugreift, woher weis dieses wieviele spalten gerade vorhanden sind, bzw. welche spalte telefon und welche mails sind?

lg andreas

nein nein nein, so is es nicht:

Pro Kunde soll es einen Satz geben mit Kundennr. und Name + 3 Felder Tel.nr + 3 Felder Email.

Es kann sein das der Kunde nur eine Tel.nr hat und keine Email. Dann hat der Satz die Tel.nr 1 befüllt, Telnr. 2 und 3 müssen initial bleiben (blank). Alle 3 Email-Felder müssen auch leer sein.

D.h. der Aufbau vom Satz ist immer gleich. ABer je nach Anzahl der Tel.nr und Email-Adr. stehen in diesen Felder Inhalte oder nicht.

Fuerchau
11-02-10, 14:09
Gehen tut fast alles, nur eine Frage der Schlüssel:

create view MyView as
with
TempTel as
(select KDNR, Min(Telefon) as Telefon
from TelDatei
group by Kdnr)
,
TempMail as
(Select Kdnr, Min(Mail) as Mail
from MailDatei
Group by Kdnr)
Select Kdnr, coalesce(Telefon, ' ') as Telefon, coalesce(Mail, ' ') as Mail
from Kunden a
left join TempTel t on a.kdnr=t.kdnr
left join TempMail m on a.kdnr=m.kdnr

Coalesce ist erforderlich um NULL, also kein Telefon und keine Mail auszuschließen.

andreaspr@aon.at
11-02-10, 14:44
nein nein nein, so is es nicht:

Pro Kunde soll es einen Satz geben mit Kundennr. und Name + 3 Felder Tel.nr + 3 Felder Email.

Es kann sein das der Kunde nur eine Tel.nr hat und keine Email. Dann hat der Satz die Tel.nr 1 befüllt, Telnr. 2 und 3 müssen initial bleiben (blank). Alle 3 Email-Felder müssen auch leer sein.

D.h. der Aufbau vom Satz ist immer gleich. ABer je nach Anzahl der Tel.nr und Email-Adr. stehen in diesen Felder Inhalte oder nicht.

asooo, da bin ich wohl vom schlimmsten ausgegangen ... dann ists einfacher ;)

Pikachu
11-02-10, 14:51
Vielleicht so? (Angaben ohne Gewähr!)

CREATE VIEW V AS (

SELECT NR, NAME, VALUE(TEL1, '') AS TEL1,
VALUE(TEL2, '') AS TEL2,
VALUE(TEL3, '') AS TEL3,
VALUE(EMAIL1,'') AS EMAIL1,
VALUE(EMAIL2,'') AS EMAIL2,
VALUE(EMAIL3,'') AS EMAIL3 FROM (

SELECT A.NR, A.NAME,

(SELECT MIN(TEL) FROM B WHERE B.NR=A.NR) AS TEL1,
(SELECT MIN(TEL) FROM B WHERE B.NR=A.NR AND
TEL>(SELECT MIN(TEL) FROM B WHERE B.NR=A.NR)) AS TEL2,
(SELECT MIN(TEL) FROM B WHERE B.NR=A.NR AND
TEL>(SELECT MIN(TEL) FROM B WHERE B.NR=A.NR AND
TEL>(SELECT MIN(TEL) FROM B WHERE B.NR=A.NR))) AS TEL3,

(SELECT MIN(EMAIL) FROM C WHERE C.NR=A.NR) AS EMAIL1,
(SELECT MIN(EMAIL) FROM C WHERE C.NR=A.NR AND
EMAIL>(SELECT MIN(EMAIL) FROM C WHERE C.NR=A.NR)) AS EMAIL2,
(SELECT MIN(EMAIL) FROM C WHERE C.NR=A.NR AND
EMAIL>(SELECT MIN(EMAIL) FROM C WHERE C.NR=A.NR AND
EMAIL>(SELECT MIN(EMAIL) FROM C WHERE C.NR=A.NR))) AS EMAIL3

FROM A) AS X)

Pikachu
11-02-10, 14:56
Oder siehe auch dieses Thema (http://newsolutions.de/forum-systemi-as400-i5-iseries/system-i-hauptforum/15138-sql-zeilen-spalten.html).