Hallo liebe SQL Gemeinde,
ich habe das im Titel genannte Problem:
ORA-01427: single-row subquery returns more than one row
Was dieser Fehler bedeutet, ist mir an sich klar. Mein UPDATE-Statemant erhält mind. zwei Werte zurück und weis daher nicht welches es verwerten soll.
Wie kann ich mein update derart einschränken, damit ich dieses Problem nicht mehr Habe?
Hier Meine Fall Beschreibung:
ERLÄUTERUNG:
In der Tabelle GST_ZEITEN habe ich Vereinsmitglieder gespeichert. Aktive-Mitglieder (MNR_STAMM) und Familienmitglieder/Fördermitglieder (NR_intern) die einem Aktivien-Mitglied angehören.
Für das Aktive_Mitglied(MNR_STAMM) gibt es eine Tätigkeits-Nummer (GST) mit den jeweiligen Zeiten (BEG_DATUM, END_DATUM) zu denen er diese Tätigkeit ausgeübt hat. Für die Familienmitglieder (NR_intern) gibt es bisher keinen GST Eintrag. Dies möchte ich ändern, in dem ich die GST des MNR_STAMM für den entsprechenden Zeitraum einem NR_intern zuorde.
Hierzu habe ich eine temporäre Tabelle (tmp_gst_zeiten) erstellt, die eine Kopie der GST_ZEITEN ist.
Die Tabllen enthalten jeweisl beide Mitglieder und sehen etwa so aus:
für MNR_STAMM
NR_intern = einmalige Mitgliedsnummer
MNR_STAMM = 1 (Da selbst MNR_STAMM)
GST = z.B. 4711
BEG_DATUM = Beginn der Tätigkeit
END_DATUM = Ende der Tätigkeit (kann auch NULL sein für aktuell)
für NR_intern
NR_intern = einmalige Mitgliedsnummer
MNR_STAMM = Mitgliedsnummer des MNR_STAMM
GST = 1 (da unbekannt)
BEG_DATUM = Beginn der Tätigkeit
END_DATUM = Ende der Tätigkeit (kann auch NULL sein für aktuell)
SQL
UPDATE GST_ZEITEN a
set a.GST=
(
select DISTINCT tmp_gst_zeiten.GST from tmp_gst_zeiten
where
a.MNR_STAMM = tmp_gst_zeiten.NR_INTERN AND
tmp_gst_zeiten.MNR_STAMM like '1' AND
tmp_gst_zeiten.GST <= '99999' AND
(
(a.END_DATUM IS NOT NULL AND
tmp_gst_zeiten.END_DATUM IS NOT NULL AND
a.END_DATUM >= tmp_gst_zeiten.BEG_DATUM AND a.END_DATUM <= tmp_gst_zeiten.END_DATUM)
OR
(a.END_DATUM IS NOT NULL AND
tmp_gst_zeiten.END_DATUM IS NULL AND
a.BEG_DATUM >= (SELECT DISTINCT max(tmp_gst_zeiten.BEG_DATUM) from tmp_gst_zeiten
where a.MNR_STAMM = tmp_gst_zeiten.NR_INTERN AND tmp_gst_zeiten.END_DATUM is NULL))
OR
(a.END_DATUM IS NULL AND
tmp_gst_zeiten.END_DATUM IS NULL AND
a.BEG_DATUM >= (SELECT DISTINCT max(tmp_gst_zeiten.BEG_DATUM) from tmp_gst_zeiten
where a.MNR_STAMM = tmp_gst_zeiten.NR_INTERN AND tmp_gst_zeiten.END_DATUM is NULL))
OR
(a.END_DATUM IS NULL AND
tmp_gst_zeiten.END_DATUM IS NOT NULL AND
a.BEG_DATUM >= tmp_gst_zeiten.BEG_DATUM AND a.BEG_DATUM <= tmp_gst_zeiten.END_DATUM)
)
)
where a.GST = '1';
PS: Wenn ich den Quelltext derart umgestallte, werden die Daten zwar aktuallisiert, allerdings allerdings falsch. Das GST der betreffenden Personen wird nicht von 1 auf das korekte GST gesetzt, sondern mit NULL überschrieben.
UPDATE GST_ZEITEN a
set a.GST=
(
select DISTINCT tmp_gst_zeiten.GST from tmp_gst_zeiten
where
a.MNR_STAMM = tmp_gst_zeiten.NR_INTERN AND
tmp_gst_zeiten.MNR_STAMM like '1' AND
tmp_gst_zeiten.GST <= '99999' AND
(
(a.END_DATUM >= tmp_gst_zeiten.BEG_DATUM AND a.END_DATUM <= tmp_gst_zeiten.END_DATUM
AND tmp_gst_zeiten.END_DATUM is not NULL)
OR
(tmp_gst_zeiten.END_DATUM is NULL AND
a.BEG_DATUM = (SELECT max(tmp_gst_zeiten.BEG_DATUM) from tmp_gst_zeiten))
)
)
where a.GST = '1';
ich habe das im Titel genannte Problem:
ORA-01427: single-row subquery returns more than one row
Was dieser Fehler bedeutet, ist mir an sich klar. Mein UPDATE-Statemant erhält mind. zwei Werte zurück und weis daher nicht welches es verwerten soll.
Wie kann ich mein update derart einschränken, damit ich dieses Problem nicht mehr Habe?
Hier Meine Fall Beschreibung:
ERLÄUTERUNG:
In der Tabelle GST_ZEITEN habe ich Vereinsmitglieder gespeichert. Aktive-Mitglieder (MNR_STAMM) und Familienmitglieder/Fördermitglieder (NR_intern) die einem Aktivien-Mitglied angehören.
Für das Aktive_Mitglied(MNR_STAMM) gibt es eine Tätigkeits-Nummer (GST) mit den jeweiligen Zeiten (BEG_DATUM, END_DATUM) zu denen er diese Tätigkeit ausgeübt hat. Für die Familienmitglieder (NR_intern) gibt es bisher keinen GST Eintrag. Dies möchte ich ändern, in dem ich die GST des MNR_STAMM für den entsprechenden Zeitraum einem NR_intern zuorde.
Hierzu habe ich eine temporäre Tabelle (tmp_gst_zeiten) erstellt, die eine Kopie der GST_ZEITEN ist.
Die Tabllen enthalten jeweisl beide Mitglieder und sehen etwa so aus:
für MNR_STAMM
NR_intern = einmalige Mitgliedsnummer
MNR_STAMM = 1 (Da selbst MNR_STAMM)
GST = z.B. 4711
BEG_DATUM = Beginn der Tätigkeit
END_DATUM = Ende der Tätigkeit (kann auch NULL sein für aktuell)
für NR_intern
NR_intern = einmalige Mitgliedsnummer
MNR_STAMM = Mitgliedsnummer des MNR_STAMM
GST = 1 (da unbekannt)
BEG_DATUM = Beginn der Tätigkeit
END_DATUM = Ende der Tätigkeit (kann auch NULL sein für aktuell)
SQL
UPDATE GST_ZEITEN a
set a.GST=
(
select DISTINCT tmp_gst_zeiten.GST from tmp_gst_zeiten
where
a.MNR_STAMM = tmp_gst_zeiten.NR_INTERN AND
tmp_gst_zeiten.MNR_STAMM like '1' AND
tmp_gst_zeiten.GST <= '99999' AND
(
(a.END_DATUM IS NOT NULL AND
tmp_gst_zeiten.END_DATUM IS NOT NULL AND
a.END_DATUM >= tmp_gst_zeiten.BEG_DATUM AND a.END_DATUM <= tmp_gst_zeiten.END_DATUM)
OR
(a.END_DATUM IS NOT NULL AND
tmp_gst_zeiten.END_DATUM IS NULL AND
a.BEG_DATUM >= (SELECT DISTINCT max(tmp_gst_zeiten.BEG_DATUM) from tmp_gst_zeiten
where a.MNR_STAMM = tmp_gst_zeiten.NR_INTERN AND tmp_gst_zeiten.END_DATUM is NULL))
OR
(a.END_DATUM IS NULL AND
tmp_gst_zeiten.END_DATUM IS NULL AND
a.BEG_DATUM >= (SELECT DISTINCT max(tmp_gst_zeiten.BEG_DATUM) from tmp_gst_zeiten
where a.MNR_STAMM = tmp_gst_zeiten.NR_INTERN AND tmp_gst_zeiten.END_DATUM is NULL))
OR
(a.END_DATUM IS NULL AND
tmp_gst_zeiten.END_DATUM IS NOT NULL AND
a.BEG_DATUM >= tmp_gst_zeiten.BEG_DATUM AND a.BEG_DATUM <= tmp_gst_zeiten.END_DATUM)
)
)
where a.GST = '1';
PS: Wenn ich den Quelltext derart umgestallte, werden die Daten zwar aktuallisiert, allerdings allerdings falsch. Das GST der betreffenden Personen wird nicht von 1 auf das korekte GST gesetzt, sondern mit NULL überschrieben.
UPDATE GST_ZEITEN a
set a.GST=
(
select DISTINCT tmp_gst_zeiten.GST from tmp_gst_zeiten
where
a.MNR_STAMM = tmp_gst_zeiten.NR_INTERN AND
tmp_gst_zeiten.MNR_STAMM like '1' AND
tmp_gst_zeiten.GST <= '99999' AND
(
(a.END_DATUM >= tmp_gst_zeiten.BEG_DATUM AND a.END_DATUM <= tmp_gst_zeiten.END_DATUM
AND tmp_gst_zeiten.END_DATUM is not NULL)
OR
(tmp_gst_zeiten.END_DATUM is NULL AND
a.BEG_DATUM = (SELECT max(tmp_gst_zeiten.BEG_DATUM) from tmp_gst_zeiten))
)
)
where a.GST = '1';
KANN MIR JEMAND HELFEN ????????????
BITTE !!!
BITTE !!!
Comment