[NEWSboard IBMi Forum]
Seite 3 von 4 Erste ... 2 3 4 Letzte

Thema: SQL Problem

  1. #25
    Registriert seit
    Apr 2006
    Beiträge
    85
    Zitat Zitat von Pikachu Beitrag anzeigen
    Paßt doch. Du brauchst natürlich ein MIN() in jedem Sub-SELECT. Wenn zum Beispiel im ersten Sub-SELECT zwei oder mehr Telefonnummern gefunden werden, treffen ja alle zu und du willst dann irgendeine von diesen. Dann nimm doch einfach die kleinste. Die erhältst du dann mit MIN() in diesem Sub-SELECT.
    sorry, dann hab ich mich falsch ausgedrückt bzw. ist der source-code vom sql veraltet:

    ich will aus der datei ADR2 die tel_number mit der KLEINSTEN consnumber, wo noch andere abfragen im WHERE drinnen sind.

    sorry, war wie gesagt ne alte source.

  2. #26
    Registriert seit
    Apr 2006
    Beiträge
    85
    Zitat Zitat von B.Hauser Beitrag anzeigen
    Warum versuchst Du nicht das SQL-Statements umzuschreiben und joins zu verwenden, wie ich es bereits vorhin vorgeschlagen habe.

    Falls ich heute Abend Zeit habe werde ich das Statement umschreiben.

    Birgitta
    weil ich SAP-Mensch bin und nicht unbedingt der große SQL-Guru ;-)))

  3. #27
    Registriert seit
    Nov 2003
    Beiträge
    2.307
    Wie ist denn die aktuelle Quelle?

  4. #28
    Registriert seit
    Apr 2006
    Beiträge
    85
    Zitat Zitat von Pikachu Beitrag anzeigen
    Wie ist denn die aktuelle Quelle?
    Code:
     
    CREATE VIEW ZKNA2_VIEW AS ( SELECT A.MANDT, A.KUNNR, A.NAME1, A.NAME 
    2, A.STRAS, A.ORT01, A.PSTLZ, A.LAND1, A.SORTL, VALUE(TEL1, '') AS T 
    EL1, VALUE(TEL2, '') AS TEL2, VALUE(MOBIL1, '') AS MOBIL1, VALUE(MOB 
    IL2, '') AS MOBIL2, VALUE(EMAIL1,'') AS EMAIL1, VALUE(EMAIL2,'') AS 
    EMAIL2, A.STCEG FROM ( SELECT A.MANDT, A.KUNNR, A.NAME1, A.NAME2, A. 
    STRAS, A.ORT01, A.PSTLZ, A.LAND1, A.SORTL, (SELECT TEL_NUMBER FROM R 
    3P02DATA.ADR2 WHERE ADDRNUMBER=A.ADRNR AND R3_USER = '1' ) AS TEL1, 
    (SELECT TEL_NUMBER FROM R3P02DATA.ADR2 WHERE ADDRNUMBER=A.ADRNR AND 
    R3_USER = ' ' ) AS TEL2, (SELECT TEL_NUMBER FROM R3P02DATA.ADR2 WHER 
    E ADDRNUMBER=A.ADRNR AND R3_USER = '3' ) AS MOBIL1, (SELECT TEL_NUMB 
    ER FROM R3P02DATA.ADR2 WHERE ADDRNUMBER=A.ADRNR AND R3_USER = '2' ) 
    AS MOBIL2, (SELECT SMTP_ADDR FROM R3P02DATA.ADR6 WHERE ADDRNUMBER=A. 
    ADRNR AND FLGDEFAULT = 'X' ) AS EMAIL1, (SELECT SMTP_ADDR FROM R3P02 
    DATA.ADR6 WHERE ADDRNUMBER=A.ADRNR AND FLGDEFAULT = ' ' ) AS EMAIL2, 
    A.STCEG FROM R3P02DATA.KNA1 A ) AS A WHERE A.KUNNR < '0000999999' A 
    ND A.MANDT = '101' AND A.KUNNR <> '0000062871' )
    sry, hab die quelle nur mehr in dieser unstrukturierten form

    die subselects bringen hin und wieder mehr als einen satz (aber selten). das möchte ich verhindern indem ich in den jeweiligen abfragen das MIN von der CONSNUMBER nehme.

  5. #29
    Registriert seit
    Nov 2003
    Beiträge
    2.307
    Das erste Sub-SELECT könnte dann vielleicht so aussehen:

    SELECT MIN(TEL_NUMBER) FROM R3P02DATA.ADR2
    WHERE ADDRNUMBER=A.ADRNR AND R3_USER = '1' AND CONSNUMBER =
    (
    SELECT MIN(CONSNUMBER) FROM R3P02DATA.ADR2
    WHERE ADDRNUMBER=A.ADRNR AND R3_USER = '1'
    )

  6. #30
    Registriert seit
    Apr 2006
    Beiträge
    85
    so, ich habe das ganze jetzt geschafft, funktioniert sehr gut, NUR: die Performance ist absolut mies. Mein Programmierer, der auf diesen View zugreift killt mich fast dafür.

    Wie kann ich das performancemässig verbessern ?

    anbei der code

    Code:
    
    CREATE VIEW cmsms1/zkna3_view AS ( 
    select A.MANDT, A.KUNNR, A.NAME1, A.NAME2, A.STRAS, A.ORT01, 
    A.PSTLZ, A.LAND1, A.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, A.STCEG FROM 
    (SELECT A.MANDT, A.kunnr, A.NAME1, A.NAME2, STRAS, A.ORT01, A.PSTLZ,
    A.LAND1, A.SORTL, A.BEGRU, 
    
    (SELECT tel_number FROM r3p02data/adr2 
    WHERE addrnumber=A.adrnr 
    and (r3_user = '1' or (r3_user = ' ' and flgdefault = 'X')) 
    and consnumber = (select min(consnumber) 
    from r3p02data/adr2 where addrnumber=A.adrnr 
    and (r3_user = '1' or (r3_user = ' ' and flgdefault = 'X')))) 
    as tel1, 
    
    (SELECT tel_number FROM r3p02data/adr2 
    WHERE addrnumber=A.adrnr 
    and r3_user = ' ' and flgdefault = ' ' 
    and consnumber = (select min(consnumber) 
    from r3p02data/adr2 where addrnumber=A.adrnr and r3_user = ' ' 
    and flgdefault = ' ')) as tel2, 
    
    (SELECT tel_number FROM r3p02data/adr2 
    WHERE addrnumber=A.adrnr 
    and (r3_user = '3' or (r3_user = '2' and flgdefault = 'X')) 
    and consnumber = (select min(consnumber) 
    from r3p02data/adr2 where addrnumber=A.adrnr 
    and (r3_user = '3' or (r3_user = '2' and flgdefault = 'X')))) 
    as mobil1, 
    
    (SELECT tel_number FROM r3p02data/adr2 
    WHERE addrnumber=A.adrnr 
    and r3_user = '2' and flgdefault = ' ' 
    and consnumber = (select min(consnumber) 
    from r3p02data/adr2 where addrnumber=A.adrnr 
    and r3_user = '2' and flgdefault = ' ')) 
    as mobil2, 
    
    (SELECT smtp_addr FROM r3p02data/adr6 
    WHERE addrnumber=A.adrnr 
    and flgdefault = 'X' and consnumber = (select min(consnumber) 
    from r3p02data/adr6 where addrnumber=A.adrnr and flgdefault = 'X')) 
    as email1, 
    
    (SELECT smtp_addr FROM r3p02data/adr6 
    WHERE addrnumber=A.adrnr 
    and flgdefault = ' ' and consnumber = (select min(consnumber) 
    from r3p02data/adr6 where addrnumber=A.adrnr and flgdefault = ' ')) 
    as email2, 
    
    A.STCEG FROM R3P02DATA/KNA1 A ) AS A WHERE A.KUNNR < '0000999999' 
    AND A.MANDT = '101' AND A.BEGRU <> 'LOES') 
    

  7. #31
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Da läßt du mal den Optimizer ein paar Meldungen ausgeben:

    STRDBG
    STRSQL
    select * from MyView
    where ...

    Im Joblog findest du diverse Hinweise zum Anlegen von Indizes.
    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

  8. #32
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    Es werden viel zu viele (unnötige!!!) SELECT-Statements ausgeführt.

    Prüfe mal, ob das folgende Statement das gleiche Ergebnis bringt und wenn ja, wie sich die Performance verhält.

    Code:
    Select A.MANDT, A.KUNNR, A.NAME1, A.NAME2, A.STRAS, A.ORT01, A.PSTLZ, A.LAND1, A.SORTL, 
           Coalesce(Min(Case When R3_User = '1' or (r3_user = ' ' and flgdefault = 'X') 
                             Then Tel_Number End), '') as Tel1,
           Coalesce(Min(Case When R3_User = ' ' and flgdefault = ' ' 
                             Then Tel_Number End), '') as Tel2,
           Coalesce(Min(Case When R3_User = '3' or (r3_user = '2' and flgdefault = 'X')
                             Then Tel_Number End), '') as Tel3,
           Coalesce(Min(Case When R3_User = '2' and flgdefault = ' ' 
                             Then Tel_Number End), '') as Tel4,
           Coalesce(Min(Case When FLGDEFAULT = 'X' 
                             Then SMTP_ADDR End), '') as EMail1,
           Coalesce(Min(Case When FLGDEFAULT = ' ' 
                             Then STMT_ADDR End), '') as EMail2
    From R3P02Data.KNA1 left outer join R3P02Data.ADR2 b on b.ADDRNUMBER = ADRNR
                        left outer join R3P02Data.ADR6 c on c.ADDRNUMBER = ADRNR
    Where  A.KUNNR < '0000999999' AND A.MANDT = '101' AND A.KUNNR <> '0000062871'
    Group By A.MANDT, A.KUNNR, A.NAME1, A.NAME2, A.STRAS, A.ORT01, A.PSTLZ, A.LAND1, A.SORTL
    Für eine akzeptable Performance sind auf alle Fälle Zugriffswege (Indices oder logische Dateien) für die jeweiligen Dateien über die Felder ADDRNUMBER, MANDT, KUNNR, ADRNR, R3_User, FLGDEFAULT erforderlich.

    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

  9. #33
    Registriert seit
    Nov 2003
    Beiträge
    2.307
    Wo ist denn da die Spalte CONSNUMBER ?

  10. #34
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    Wo ist denn da die Spalte CONSNUMBER ?
    Die hab' ich unterschlagen, weil war auch in dem Statement, das gestern oder so gepostet wurde nicht drin.

    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

  11. #35
    Registriert seit
    Apr 2006
    Beiträge
    85
    Zitat Zitat von B.Hauser Beitrag anzeigen
    Es werden viel zu viele (unnötige!!!) SELECT-Statements ausgeführt.

    Prüfe mal, ob das folgende Statement das gleiche Ergebnis bringt und wenn ja, wie sich die Performance verhält.

    Code:
    Select A.MANDT, A.KUNNR, A.NAME1, A.NAME2, A.STRAS, A.ORT01, A.PSTLZ, A.LAND1, A.SORTL, 
           Coalesce(Min(Case When R3_User = '1' or (r3_user = ' ' and flgdefault = 'X') 
                             Then Tel_Number End), '') as Tel1,
           Coalesce(Min(Case When R3_User = ' ' and flgdefault = ' ' 
                             Then Tel_Number End), '') as Tel2,
           Coalesce(Min(Case When R3_User = '3' or (r3_user = '2' and flgdefault = 'X')
                             Then Tel_Number End), '') as Tel3,
           Coalesce(Min(Case When R3_User = '2' and flgdefault = ' ' 
                             Then Tel_Number End), '') as Tel4,
           Coalesce(Min(Case When FLGDEFAULT = 'X' 
                             Then SMTP_ADDR End), '') as EMail1,
           Coalesce(Min(Case When FLGDEFAULT = ' ' 
                             Then STMT_ADDR End), '') as EMail2
    From R3P02Data.KNA1 left outer join R3P02Data.ADR2 b on b.ADDRNUMBER = ADRNR
                        left outer join R3P02Data.ADR6 c on c.ADDRNUMBER = ADRNR
    Where  A.KUNNR < '0000999999' AND A.MANDT = '101' AND A.KUNNR <> '0000062871'
    Group By A.MANDT, A.KUNNR, A.NAME1, A.NAME2, A.STRAS, A.ORT01, A.PSTLZ, A.LAND1, A.SORTL
    Für eine akzeptable Performance sind auf alle Fälle Zugriffswege (Indices oder logische Dateien) für die jeweiligen Dateien über die Felder ADDRNUMBER, MANDT, KUNNR, ADRNR, R3_User, FLGDEFAULT erforderlich.

    Birgitta
    Vielen Dank für den Code. Aber das ist ja jetzt ein Select auf die einzelnen Datein und keine View-Erstellung. Es muss auf diesen View zugegriffen werden, da ein direkter Zugriff auf die Datein in der Lib R3P02DATA nicht erlaubt ist von aussen, da es sich hier um ein SAP-System handelt mit strikten Regeln für den Zugriff

    D.h. ich MUSS einen View erstellen in einer eigenen Lib auf den dann zugegriffen wird von einer anderen AS/400.

  12. #36
    Registriert seit
    Nov 2003
    Beiträge
    2.307
    CREATE VIEW ViewName AS ( SELECT ... )

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
  •