Impressum · Kontakt · Hilfe
Besucher online · Mitglieder



Antwort
 
Themen-Optionen
Alt 27.01.2006, 19:57   Nach oben    #1
Guradia
Benutzer
 
Benutzerbild von Guradia
 
Registriert seit: 18.08.2005
Ort: Düsseldorf
Beiträge: 57
Standard Your most abnormal Query

Da ich gerade an einer kleinen Query rumgedoktert habe, die mir einigen PHP-Code abnehmen soll .. entstand dieses dieses Machwerk:

Code:
UPDATE  auftraege,
        (
            SELECT   auftragsid
                    ,SUBSTRING(
                         GROUP_CONCAT(positionen.artikelgruppe ORDER BY artikel_wert.wert DESC)
                        ,1
                        ,LOCATE(',', GROUP_CONCAT(positionen.artikelgruppe ORDER BY artikel_wert.wert DESC)) - 1
                        ) as gruppe
            FROM    positionen 
                INNER JOIN artikel_wert
                     ON positionen.artikelgruppe = artikel_wert.gruppe
            GROUP
                 BY positionen.auftragsid ASC
        ) AS pos
         
SET   auftraege.artikelgruppe = pos.gruppe
WHERE auftraege.id = pos.auftragsid
;
Ungefährer Sinn:
> `positionen` enthält mehrere einträge zu einem Auftrag
> Eine der Positionen gilt als "Hauptartikel"
> Bestimmt wird der Hauptartikel über `artikel_wert`
> Dort ist z.b. für ein 'Bett' die Wertigkeit 100 hinterlegt, ein 'Tisch' kommt nur auf 90.
> 'Tisch' und 'Bett' sind Werte, die in `positionen.artikelgruppe` wiederzufinden sind.
> Die Artikelgruppe des Hauptartikel soll dem Auftrag zugesprochen werden. Was bei den knapp 2.000 Aufträgen im System derzeit nicht hinterlegt war.

Die Query löst das in einem Rutsch.

Ich meine .. es ist nicht das längste, aber das perverseste Stück Abfrage, das mir bislang aus den Fingern kam ...
Guradia ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 28.01.2006, 16:35   Nach oben    #2
Sclot
Projektleiter
 
Benutzerbild von Sclot
 
Registriert seit: 18.08.2005
Ort: Bremen
Beiträge: 149
Standard

du willst was richtig perverses haben?

Code:
SELECT * FROM tabelle
Sclot ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 28.01.2006, 17:46   Nach oben    #4
Corvin
Erfahrener Benutzer
 
Benutzerbild von Corvin
 
Registriert seit: 19.03.2005
Ort: S-H | Flensburg
Beiträge: 445
Standard

Wie lange hast du dafür gebraucht?
__________________
Corvin ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 28.01.2006, 17:47   Nach oben    #5
Ben
Erfahrener Benutzer
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.619
Standard

Sclot? Denke nicht so lange .. bin mir aber nicht sicher ..
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 28.01.2006, 18:15   Nach oben    #6
Corvin
Erfahrener Benutzer
 
Benutzerbild von Corvin
 
Registriert seit: 19.03.2005
Ort: S-H | Flensburg
Beiträge: 445
Standard

Ne... Guradia.
__________________
Corvin ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 30.01.2006, 10:26   Nach oben    #7
Guradia
Benutzer
 
Benutzerbild von Guradia
 
Registriert seit: 18.08.2005
Ort: Düsseldorf
Beiträge: 57
Standard

Zitat:
Zitat von Corvin Gröning
Ne... Guradia.
Rauszubekommen, wie ich nur den relevanten Wert aus zusammengefügten String raushole hat etwas gedauert.

Und wo ich dann die Subquery unterzubringen hatte, war nicht ganz so flott rauszubekommen.

Insgesamt hats mit wohl an die Stunde Arbeit gekostet, ber nun bin auch wieder imens schlauer als zuvor ^^
Guradia ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 30.01.2006, 10:58   Nach oben    #8
Corvin
Erfahrener Benutzer
 
Benutzerbild von Corvin
 
Registriert seit: 19.03.2005
Ort: S-H | Flensburg
Beiträge: 445
Standard

Eine Stunde für eine Abfrage.. oh mann

Ich würde da noch ein paar Kommentare einbauen, da blickt man ja sonst recht schnell nicht mehr durch.
__________________
Corvin ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 20.03.2006, 04:12   Nach oben    #9
Entitaet
Benutzer
 
Registriert seit: 15.02.2005
Beiträge: 33
Standard

Zitat:
Zitat von Guradia
Da ich gerade an einer kleinen Query rumgedoktert habe, die mir einigen PHP-Code abnehmen soll .. entstand dieses dieses Machwerk:

Ich meine .. es ist nicht das längste, aber das [..] das mir bislang aus den Fingern kam ...
Das nennst du das "perverste Stück Abfrage"?

Au Mann, was soll ich da erst sagen oder besser schreiben!? Meine längsten Abfragen haben schon locker an die 60-Zeilen und mehr erreicht.

Dagegen ist dein "Trum" ja ein Witz.
__________________
No Sig
Entitaet ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 20.03.2006, 11:37   Nach oben    #10
Jann Hendrik
Projektleiter
 
Benutzerbild von Jann Hendrik
 
Registriert seit: 02.12.2004
Ort: Wildeshausen
Beiträge: 2.212
Standard

Zitat:
Zitat von Entitaet
Meine längsten Abfragen haben schon locker an die 60-Zeilen und mehr erreicht.
zeig doch!
__________________

Umfragen:
bitte beachten: Vorschläge für künftige Umfragen
Woher weißt du vom developers-guide?

Wenn du dich in ein interessantes Thema eingearbeitet hast, dann lass andere daran teilhaben! Schreibe ein Tutorial und beschreibe, wie es geht, was nicht klappt, wo man aufpassen muss usw.
Danke!
Jann Hendrik ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 20.03.2006, 19:57   Nach oben    #11
Entitaet
Benutzer
 
Registriert seit: 15.02.2005
Beiträge: 33
Standard

Zitat:
Zitat von Jann Hendrik
[..]
zeig doch!
Gerne, also hier eine SELECT-Abfrage, an der ich kürzlich immer wieder herumgebastelt habe. Die wahre Komplexität erschließt sich aber erst, wenn man neben der eigentlichen SELECT-Abfrage auch noch die Package-Funktionen mit abbilden würde, das aber den Rahmen hier bei weitem sprengen würde

Code:
..
         OPEN io_cur
          FOR
                SELECT distinct(nh.iidentif_snr) AS hre_id,
                       decode(o.ihierarch_stu, 1, o.ccode1, 2, o.ccode2)  AS geb_nr,
                       nh.ccode2 AS etage,
                       nh.ccode5 AS raum,
                       (select hre.cbez1 
                       from nhreinhe hre 
                       where hre.iidentif_snr = (SELECT  ifid_vati
                              FROM  nhreinhe
                              START WITH iidentif_snr = nh.iidentif_snr
                           CONNECT BY PRIOR iidentif_snr = ifid_vati)) AS raumbezeichnung,
                       nh.cbez1 AS raumzonenbez,
                       nvl(gf.ccode1,'') AS na,
                       nvl(gf.cbez1,'') AS hnf_bez,
                       nvl(gf.cbez2,'') AS rna,
                       ac_flaeuml.GET_NA_MA(nh.iidentif_snr) AS NA_MA,
                       ac_flaeuml.GET_MA(nh.iidentif_snr) AS MA,
                       ac_flaeuml.GET_FLAE_ZUO(nh.iidentif_snr) AS flae_zuo,
                       no.cbez1 AS vermieter,
                       no.ccode1 AS vermieter_wkz,
                       gk.ccode1 AS vermieter_kst,
                       ac_flaeuml.GET_MIETER(nh.iidentif_snr) AS mieter,
                       ac_flaeuml.GET_MIET_KST(nh.iidentif_snr) AS miet_kst,
                       ac_flaeuml.GET_MIETER_WKZ(nh.iidentif_snr) AS mieter_wkz,
                       round(nh.rflaeche,2) AS flaeche,
                       round(ac_flaeuml.GET_UML_FLAE(nh.iidentif_snr, o.iidentif_snr, nh.rflaeche),2) AS uml_flae,
                       round(ac_flaeuml.GET_MIET_FLAE(nh.iidentif_snr, o.iidentif_snr, nh.rflaeche),2) AS miet_flae,
                       ac_flaeuml.GET_MKA(nh.iidentif_snr) AS mka,
                       ac_flaeuml.GET_MKA_CBEZ2(nh.iidentif_snr) AS mka_cbez2,
                       ac_flaeuml.GET_MKA_CBEZ1(nh.iidentif_snr) AS mka_cbez1,
                       round(ac_flaeuml.GET_MIETPREIS(nh.iidentif_snr, o.iidentif_snr, nh.rflaeche),2) AS mietpreis,
--                       round(ac_flaeuml.GET_MONATSMIETE(nh.iidentif_snr, o.iidentif_snr, nh.rflaeche),2) AS monatsmiete,
                       round(ac_flaeuml.GET_MONATSMIETE(nh.iidentif_snr, o.iidentif_snr, nh.rflaeche)+round(ac_flaeuml.GET_MONATSMIETE(nh.iidentif_snr, o.iidentif_snr, nh.rflaeche)-round(ac_flaeuml.GET_MONATSMIETE(nh.iidentif_snr, o.iidentif_snr, nh.rflaeche),3),3),2) AS monatsmiete,
--                       round(ac_flaeuml.GET_MONATSMIETE(nh.iidentif_snr, o.iidentif_snr, nh.rflaeche)*12+round(ac_flaeuml.GET_MONATSMIETE(nh.iidentif_snr, o.iidentif_snr, nh.rflaeche)*12-round(ac_flaeuml.GET_MONATSMIETE(nh.iidentif_snr, o.iidentif_snr, nh.rflaeche)*12,3),3),2) AS jahresmiete,
                       decode(ac_flaeuml.EXISTS_SONDERMIETE(nh.iidentif_snr), 0, round(ac_flaeuml.GET_MONATSMIETE(nh.iidentif_snr, o.iidentif_snr, nh.rflaeche)*12,2), 1, ac_flaeuml.GET_ROUNDED_JM(nh.iidentif_snr, o.iidentif_snr, nh.rflaeche) ) AS jahresmiete,
--                       round(ac_flaeuml.GET_MONATSMIETE(nh.iidentif_snr, o.iidentif_snr, nh.rflaeche)*12,2) AS jahresmiete,
                       round(ac_flaeuml.GET_SONDERMIETE(nh.iidentif_snr),2) AS sondermiete,
                       decode(ac_flaeuml.GET_ZA(nh.iidentif_snr),12.0,'J',6.0,'H',3.0,'Q',1.0,'M',-1.0,'') AS za,
                       ac_flaeuml.GET_UML_ANTEIL(o.iidentif_snr) AS umlagefaktor
                FROM   zobjcost zoc, 
                       nobjekt o, 
                       norganis no, 
                       gkostel gk,
                       nhreinhe nh,
                       gflart1 gf
             where  o.iidentif_snr IN (
                                  select  iidentif_snr 
                                    from  nobjekt 
                                   where  ihierarch_stu = 2
                                          START WITH iidentif_snr = i_keynr
                                          CONNECT BY PRIOR iidentif_snr = ifid_vati)
                  and  nh.ifnobje_super = o.iidentif_snr
                  and  gk.iidentif_snr = zoc.ifgkostid_tab
                  and  gk.ifnorga_super = no.iidentif_snr
                  and  nh.ihierarch_stu = 6
                  and  nh.IFGNUTZID_TAB = gf.iidentif_snr(+)
                 order by 2,15,4,6,8;
--
--    alle sonstigen Fälle ...
--
      ELSE
         OPEN io_cur
...
__________________
No Sig
Entitaet ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 20.03.2006, 20:04   Nach oben    #13
Entitaet
Benutzer
 
Registriert seit: 15.02.2005
Beiträge: 33
Standard

Zitat:
Zitat von Ben
*augenreib*
Tja Jung, da staunste.

Nee, aber im Ernst, das sind so übliche Sachen, mit denen ich mich u.a. herumschlagen darf.

Das ganze Package (inkl. der zitierten SELECT-Abfrage) hat fast 2200 Zeilen an Code.
__________________
No Sig
Entitaet ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 20.03.2006, 20:09   Nach oben    #14
Ben
Erfahrener Benutzer
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.619
Standard

Zitat:
Zitat von Entitaet
Zitat:
Zitat von Ben
*augenreib*
Tja Jung, da staunste.
Joa .. das tu ich wohl.
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 20.03.2006, 21:23   Nach oben    #15
Corvin
Erfahrener Benutzer
 
Benutzerbild von Corvin
 
Registriert seit: 19.03.2005
Ort: S-H | Flensburg
Beiträge: 445
Standard

Die Ausführung dauert dann aber auch sicher eine Weile, ne?
__________________
Corvin ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 20.03.2006, 21:57   Nach oben    #16
Entitaet
Benutzer
 
Registriert seit: 15.02.2005
Beiträge: 33
Standard

Zitat:
Zitat von Corvin Gröning
Die Ausführung dauert dann aber auch sicher eine Weile, ne?
Ja, auf meiner Maschine z. B. (Client und Server zugleich) benötigt die Abfrage ca. 25 Sekunden. Da es sich um eine Oracle-DB handelt, kann man das aber mit einigen Tricks noch locker verbessern.

Aber das ist dann schon wieder ein ganz anderes Thema.
__________________
No Sig
Entitaet ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 02.04.2006, 22:36   Nach oben    #17
xardias
Erfahrener Benutzer
 
Benutzerbild von xardias
 
Registriert seit: 02.03.2006
Ort: Aachen
Beiträge: 123
Standard

Ein Hoch auf Caching Mechanismen
xardias ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 03.04.2006, 13:23   Nach oben    #18
mepeisen
Erfahrener Benutzer
 
Registriert seit: 30.03.2006
Ort: Pfinztal
Beiträge: 355
Standard

Den kann ich über, den kann ich über....
Und das ist einer meiner einfachsten

Code:
SELECT 
    Zuordnung.NR_PROFIL_ID, 
    Zuordnung.Profilart, 
    Zuordnung.NR_FKT_ID, 
    Zuordnung.NR_AUFTRAG, 
    Zuordnung.SL_AENDERUNG AS ZuordAend, 
    Zuordnung.WRT_TS_AEND AS ZuordTSAend, 
    AttWertebereich.NR_ATTRIBUT_ID, 
    AttWertebereich.AttAuftrag, 
    AttWertebereich.AttAenderung, 
    AttWertebereich.AttTSAenderung, 
    AttWertebereich.KZ_ZULAESSIG, 
    AttWertebereich.SL_WB_TYP, 
    AttWertebereich.WRT_INHALT_WB, 
    AttWertebereich.WbAuftrag, 
    AttWertebereich.WbAenderung, 
    AttWertebereich.WbTSAenderung 
FROM 
    ( 
    SELECT 
        ZuordStd.NR_PROFIL_ID, 
        'S' AS Profilart, 
        ZuordStd.NR_FKT_ID, 
        0 AS NR_AUFTRAG, 
        0 AS SL_AENDERUNG, 
        ZuordStd.WRT_TS_AEND 
    FROM 
        ( 
        SELECT 
            NR_PROFIL_ID, 
            NR_FKT_ID, 
            MAX(WRT_TS_AEND) AS WRT_TS_AEND 
        FROM T00.VNPT1045 
        WHERE NR_PROFIL_ID IN (10001, 10004, 10005, 10008, 10010, 10013, 10014, 10020) 
        GROUP BY NR_PROFIL_ID, 
            NR_FKT_ID
        ) AS tmp0 
    INNER JOIN 
        T00.VNPT1045 ZuordStd 
        ON tmp0.NR_PROFIL_ID=ZuordStd.NR_PROFIL_ID 
        AND tmp0.NR_FKT_ID=ZuordStd.NR_FKT_ID 
        AND tmp0.WRT_TS_AEND=ZuordStd.WRT_TS_AEND 
    WHERE ZuordStd.SL_AENDERUNG <> 4 
    UNION 
    SELECT 
        COALESCE(ZuordBankP.NR_PROFIL_ID, ZuordBankH.NR_PROFIL_ID) AS NR_PROFIL_ID, 
        'B' AS Profilart, 
        COALESCE(ZuordBankP.NR_FKT_ID, ZuordBankH.NR_FKT_ID) AS NR_FKT_ID, 
        COALESCE(ZuordBankP.NR_AUFTRAG, 0) AS NR_AUFTRAG, 
        COALESCE(ZuordBankP.SL_AENDERUNG, 0) AS SL_AENDERUNG, 
        COALESCE(ZuordBankP.WRT_TS_AEND, ZuordBankH.WRT_TS_FREIGABE) AS WRT_TS_AEND 
    FROM 
        ( 
        SELECT 
            Planung.NR_PROFIL_ID, 
            Planung.NR_AUFTRAG, 
            Planung.NR_FKT_ID, 
            Planung.SL_AENDERUNG, 
            Planung.WRT_TS_AEND 
        FROM T00.VNPT1030 Planung 
        WHERE Planung.RZBK = 8844 
            AND Planung.NR_PROFIL_ID IN (10001, 10004, 10005, 10008, 10010, 10013, 10014, 10020)
        ) 
        ZuordBankP 
    FULL OUTER JOIN 
        ( 
        SELECT 
            Historie.NR_PROFIL_ID, 
            Historie.NR_AUFTRAG, 
            Historie.NR_FKT_ID, 
            Historie.SL_AENDERUNG, 
            Historie.WRT_TS_FREIGABE 
        FROM 
            (
            SELECT 
                * 
            FROM T00.VNPT1044 
            WHERE RZBK = 8844
            ) 
            Historie 
        INNER JOIN 
            ( 
            SELECT 
                RZBK, 
                NR_PROFIL_ID, 
                NR_FKT_ID, 
                MAX(WRT_TS_FREIGABE) WRT_TS_FREIGABE 
            FROM T00.VNPT1044 
            WHERE RZBK = 8844