Zusammenbruch Mehrerer Datensätze Zu einem Einzigen Datensatz Mit Mehreren Spalten

In einem Programm Pflege ich, wir bekamen eine riesige (~500 Zeilen) SQL-Anweisung durch den Kunden. Es wird verwendet für die Erzeugung von flat files mit fester Länge Datensätze für die übermittlung von Daten zu einem anderen großen Geschäft. Da es ein massives flat-file sein, nicht relationale und die standard-normal-Formen der Daten sind zusammengebrochen. Also, wenn Sie einen Datensatz mit mehreren codes zugeordnet, in diesem Fall bis zu 19 haben Sie alle geschrieben werden, in Zeile, aber seperate Felder in der flachen Datei.

Hinweis: dieses Beispiel ist vereinfacht.

Den Daten könnte wie folgt Aussehen, mit drei Tabellen:

RECORDS
record_id   firstname   lastname    
--------------------------------    
123         Bob         Schmidt
324         George      Washington
325         Ronald      Reagan
290         George      Clooney


CODE_TABLE
code_id     code_cd     code_txt
--------------------------------
5           3           President
2           4           Actor    
3           7           Plumber


CODES_FOR_RECORDS
record_id   code_cd
-------------------
123         7    
325         3
290         4
324         3
325         4
123         4

Diese Bedürfnisse zu produzieren Datensätze wie:

firstname   lastname    code1       code2       code3
Bob         Schmidt     Actor       Plumber     NULL
George      Washington  President   NULL        NULL
Ronald      Reagon      Actor       President   NULL
George      Clooney     Actor       NULL        NULL

Den Teil der aktuellen Abfrage an, wir bekamen die aussieht wie diese, aber mit 19 code-Spalten anstelle der 5:

select 
    x.record_id,
    max(case when  x.rankk = 1  then code_txt end) as CodeColumn1,
    max(case when  x.rankk = 2  then code_txt end) as CodeColumn2,
    max(case when  x.rankk = 3  then code_txt end) as CodeColumn3,
    max(case when  x.rankk = 4  then code_txt end) as CodeColumn4,
    max(case when  x.rankk = 5  then code_txt end) as CodeColumn5,
from 
    (
        select 
            r.record_id,
            ct.code_txt as ctag ,
            dense_rank() over (partition by r.record_id order by cfr.code_id) as rankk
        from            
            records as r
            codes_for_records as cfr,
            code_table as ct
        where
            r.record_id = cfr.record_id
            and ct.code_cd = cfr.code_cd
            and cfr.code_cd is not null
            and ct.code_txt not like '%V%'
    ) as x
where
    x.record_id is not null
group by
    x.record_id  

Ich nach unten getrimmt, die Dinge für simplicties Willen, sondern die eigentliche Aussage beinhaltet eine innere Abfrage und eine Verknüpfung und mehr, wo die Bedingungen, aber das sollte auf die Idee kommen über. Mein Gehirn sagt mir, es muss einen besseren Weg, aber ich bin kein SQL-Experte. Wir sind mit der DB2 v8, wenn das hilft. Und die codes werden in separaten Spalten, so dass keine Koaleszenz Dinge in einem einzigen string. Gibt es eine sauberere Lösung als diese?

Update:

Landete ich nur refacorting das original query, es sill verwendet die häßlich MAX () - Geschäft, aber insgesamt, die Abfrage ist sehr viel besser lesbar durch Nachbesserung anderen teilen.

  • Wenn ich code schreiben, um Daten zu transformieren und manuell, das Verfahren ist selten unter 1000 Zeilen lang. Der code sieht ziemlich einfach und unkompliziert auf mich.
  • Vielleicht, dass ich bin nicht wirklich vertraut mit SQL, da mir scheint, dass Art verwickelt. Und ein Teil davon ist ein 1.000-Zeilen, wenn getrennt in logischen Blöcken ist nicht schlecht. 500 Zeilen SQL, das ist so miteinander verbunden, wie es scheint, spaghetti, ist eine andere Sache, IMHO.
InformationsquelleAutor troutinator | 2011-02-07
Schreibe einen Kommentar