[NEWSboard IBMi Forum]
Seite 1 von 4 1 2 ... Letzte

Thema: SQL Problem

  1. #1
    Registriert seit
    Apr 2006
    Beiträge
    85

    Wink 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' )

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Nimm einfach die Aggregat-Funktion MIN, dann bekommst du halt immer die kleinste Nummer:

    select ..., (select min(xxx) from ...) as xxx, ...
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  3. #3
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    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
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  4. #4
    Registriert seit
    Apr 2006
    Beiträge
    85
    an das hab ich schon gedacht, das funktioniert leider nicht

    ich kann hier nicht immer die kleinste nummer nehmen, da sie ja unterschiedlich ist.

  5. #5
    Registriert seit
    Apr 2006
    Beiträge
    85
    Zitat Zitat von B.Hauser Beitrag anzeigen
    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.

  6. #6
    cbe is offline [professional_User]
    Registriert seit
    May 2005
    Beiträge
    392
    Zitat Zitat von bettina_martin Beitrag anzeigen
    ...
    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

  7. #7
    Registriert seit
    Nov 2003
    Beiträge
    2.307
    Mit MIN() in den Unterabfragen sollte das doch gehen:

    PHP-Code:
    (SELECT MIN(tel_numberFROM 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.

  8. #8
    Registriert seit
    Aug 2003
    Beiträge
    1.508
    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' )

  9. #9
    Registriert seit
    Apr 2006
    Beiträge
    85
    Zitat Zitat von andreaspr@aon.at Beitrag anzeigen
    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 ;-)

  10. #10
    Registriert seit
    Nov 2003
    Beiträge
    2.307

  11. #11
    Registriert seit
    Aug 2003
    Beiträge
    1.508
    Du brauchst "NUR" die SQL-Referenz durchzulesen, dann findest du einige nützliche feinheiten

    PDF files for Database

  12. #12
    cbe is offline [professional_User]
    Registriert seit
    May 2005
    Beiträge
    392
    Zitat Zitat von andreaspr@aon.at Beitrag anzeigen
    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

  1. problem mit eigener sql function
    By Stefan_Sk in forum NEWSboard Programmierung
    Antworten: 8
    Letzter Beitrag: 26-05-06, 16:37
  2. SQL Problem
    By Lucky4712 in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 24-05-06, 15:57
  3. Problem bei Abfrage bei Imbedded SQL
    By cbe in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 08-06-05, 16:21
  4. embedded SQL Performance Problem mit SCROLL
    By itec01 in forum IBM i Hauptforum
    Antworten: 9
    Letzter Beitrag: 16-09-04, 18:38
  5. Problem bei ILE COBOL mit sql connect to
    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
  •