-
SQL Problem
Hi,
habe unten angeführten SQL CREATE VIEW. Jetzt habe ich leider das Problem das eine select * from cmsms1/zkna2_view (also auf den 'fertigen' View) einen
SQL0811 Fehler bringt, der sagt "Nachricht . . . : Ergebnis der Anweisung enthält mehr als eine Zeile"
Habe herausgefunden das die unteren Selects auf die Tabellen ADR2 und ADR6 nicht eindeutig sind und (selten aber doch) mehr als EINE Zeile bringen als Ergebnis.
Wie kann ich die Unterabfragen auf ADR2 und ADR6 so gestalten das nur EINE Zeile ausgegeben wird, nämlich die ERSTE die den Selektionskriterien entspricht ??
Code:
CREATE VIEW cmsms1/zkna2_view AS (
select MANDT, KUNNR, NAME1, NAME2, STRAS, ORT01, PSTLZ, LAND1,
SORTL, VALUE(TEL1, '') AS TEL1,
VALUE(TEL2, '') AS TEL2,
VALUE(MOBIL1, '') AS MOBIL1,
VALUE(MOBIL2, '') AS MOBIL2,
VALUE(EMAIL1,'') AS EMAIL1,
VALUE(EMAIL2,'') AS EMAIL2, STCEG FROM (
SELECT A.kunnr, A.NAME1,
(SELECT tel_number FROM r3p02data/adr2
WHERE addrnumber=A.adrnr and consnumber='001' ) AS TEL1,
(SELECT tel_number FROM r3p02data/adr2
WHERE addrnumber=A.adrnr and consnumber='002' ) AS TEL2,
(SELECT tel_number FROM r3p02data/adr2
WHERE addrnumber=A.adrnr and consnumber='003' ) AS MOBIL1,
(SELECT tel_number FROM r3p02data/adr2
WHERE addrnumber=A.adrnr and consnumber='004' ) AS MOBIL2,
(SELECT smtp_addr FROM r3p02data/adr6
WHERE addrnumber=A.adrnr and consnumber='001' ) AS EMAIL1,
(SELECT smtp_addr FROM r3p02data/adr6
WHERE addrnumber=A.adrnr and consnumber='002' ) AS EMAIL2
FROM r3p02data/kna1 a ) as A where kunnr<>'0000062871' )
-
Nimm einfach die Aggregat-Funktion MIN, dann bekommst du halt immer die kleinste Nummer:
select ..., (select min(xxx) from ...) as xxx, ...
-
Versuch's mal mit SELECT DISTINCT Feld From ...
Ansonsten würde ich die Sub-Selects durch Joins und entsprechende Feldauswahl ersetzten. Du führst 3 SELECT-Statements auf ADR2 aus anstatt 1x mit ADR2 zu verknüpfen. Diese Umstellung sollte performancemäßig einiges bringen.
Weiterhin würde ich keine Sub-Selects in Views verwenden, sondern einzelne Views erstellen, die anschließend in einer weiteren View verknüpft werden.
Birgitta
-
an das hab ich schon gedacht, das funktioniert leider nicht
ich kann hier nicht immer die kleinste nummer nehmen, da sie ja unterschiedlich ist.
-
Zitat von B.Hauser
Versuch's mal mit SELECT DISTINCT Feld From ...
ein SELECT DISTINCT entfernt nur Sätze die vom Inhalt her gleich sind. Das ist hier ja nicht der Fall.
-
Zitat von bettina_martin
...
Wie kann ich die Unterabfragen auf ADR2 und ADR6 so gestalten das nur EINE Zeile ausgegeben wird, nämlich die ERSTE die den Selektionskriterien entspricht ??
Was meinst Du denn mit "ERSTE Zeile"? Gibt es ein eindeutiges Sortierkriterium?
Folgender Ansatz ist schon fast gut:
select ..., (select min(xxx) from ...) as xxx, ...
allerdings möchtest Du ja die Felder aus 1 Satz und nicht das jeweilige MIN.
Ich nehme einfach mal an, die eMail-Adresse wäre eindeutig. Ansonsten nimm halt die TelNr oder ein anderes Kriterium. (Ob die RRN() funktionieren würde bin ich allerdings nicht sicher.)
Wie wäre es also mit:
Code:
...
SELECT A.kunnr, A.NAME1,
(SELECT tel_number FROM r3p02data/adr2
WHERE addrnumber=A.adrnr and consnumber='001' and
smtp_addr = (select min(smtp_addr FROM r3p02data/adr6
WHERE addrnumber=A.adrnr and consnumber='001')
) AS TEL1,
...
(SELECT min(smtp_addr) FROM r3p02data/adr6
WHERE addrnumber=A.adrnr and consnumber='001' ) AS EMAIL1,
...
Passt das so?
Und wegen der Performance probiers einfach aus, es hängt ja von vielen Faktoren ab.
Gruß, Christian
-
Mit MIN() in den Unterabfragen sollte das doch gehen:
PHP-Code:
(SELECT MIN(tel_number) FROM r3p02data/adr2
WHERE addrnumber=A.adrnr and consnumber='001' ) AS TEL1
anstelle von
PHP-Code:
(SELECT tel_number FROM r3p02data/adr2
WHERE addrnumber=A.adrnr and consnumber='001' ) AS TEL1
usw.
-
Hi,
probiers mal mit "fetch first row only" wenn es wirklich egal ist ob du den ersten oder letzten DS bekommst!
Code:
CREATE VIEW cmsms1/zkna2_view AS (
select MANDT, KUNNR, NAME1, NAME2, STRAS, ORT01, PSTLZ, LAND1,
SORTL, VALUE(TEL1, '') AS TEL1,
VALUE(TEL2, '') AS TEL2,
VALUE(MOBIL1, '') AS MOBIL1,
VALUE(MOBIL2, '') AS MOBIL2,
VALUE(EMAIL1,'') AS EMAIL1,
VALUE(EMAIL2,'') AS EMAIL2, STCEG FROM (
SELECT A.kunnr, A.NAME1,
(SELECT tel_number FROM r3p02data/adr2
WHERE addrnumber=A.adrnr and consnumber='001' fetch first row only) AS TEL1,
(SELECT tel_number FROM r3p02data/adr2
WHERE addrnumber=A.adrnr and consnumber='002' fetch first row only) AS TEL2,
(SELECT tel_number FROM r3p02data/adr2
WHERE addrnumber=A.adrnr and consnumber='003' fetch first row only) AS MOBIL1,
(SELECT tel_number FROM r3p02data/adr2
WHERE addrnumber=A.adrnr and consnumber='004' fetch first row only) AS MOBIL2,
(SELECT smtp_addr FROM r3p02data/adr6
WHERE addrnumber=A.adrnr and consnumber='001' fetch first row only) AS EMAIL1,
(SELECT smtp_addr FROM r3p02data/adr6
WHERE addrnumber=A.adrnr and consnumber='002' fetch first row only) AS EMAIL2
FROM r3p02data/kna1 a ) as A where kunnr<>'0000062871' )
-
Zitat von andreaspr@aon.at
Hi,
probiers mal mit "fetch first row only" wenn es wirklich egal ist ob du den ersten oder letzten DS bekommst!
Woher hast du DAS ? das statement ist ja nirgendwo dokumentiert ;-)
-
-
Du brauchst "NUR" die SQL-Referenz durchzulesen, dann findest du einige nützliche feinheiten
PDF files for Database
-
Zitat von andreaspr@aon.at
fetch first row only
geht ja auch interaktiv - nett, wieder was gelernt.
Ich frage mich nur, ob man sich darauf verlassen kann, dass die Sortierung immer dieselbe ist, denn sonst würde im 2. Unter-Select ein anderer Satz verwendet.
Gruß, Christian
Similar Threads
-
By Stefan_Sk in forum NEWSboard Programmierung
Antworten: 8
Letzter Beitrag: 26-05-06, 16:37
-
By Lucky4712 in forum IBM i Hauptforum
Antworten: 2
Letzter Beitrag: 24-05-06, 15:57
-
By cbe in forum NEWSboard Programmierung
Antworten: 2
Letzter Beitrag: 08-06-05, 16:21
-
By itec01 in forum IBM i Hauptforum
Antworten: 9
Letzter Beitrag: 16-09-04, 18:38
-
By rebe in forum IBM i Hauptforum
Antworten: 1
Letzter Beitrag: 07-09-01, 13:55
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks