Avatar billede las23pedersen Nybegynder
08. juli 2011 - 14:52 Der er 3 kommentarer

SQL: table rows som table columns

Scenarie:

Table1 (Personer)

ID : Navn
-----------------
1 : Peter
2 : Dennis
3 : Anne

Table2 (Attributter)

Link_ID : Type : Text
---------------------------
1 : telefon : 20202020
1 : fax : 20302020
1 : land : Danmark
2 : Telefon : 50503030
3 : land : Sverige
3 : fax : 70707070

Hvordan laver jeg en solid SQL som giver mig:


ID : Navn : Telefon : Fax : Land
-------------------------------------------------
1 : Peter : 20202020 : 20302020 : Danmark
2 : Dennis : 50503030 : null : null
3 : Anne : null : 70707070 : Sverige
Avatar billede arne_v Ekspert
08. juli 2011 - 18:59 #1
proev:


SELECT personer.id,personer.navn,a1.text,a2.text,a3.text
FROM personer
LEFT JOIN attributter a1 ON personer.id=a1.link_id AND a1.type='telefon'
LEFT JOIN attributter a2 ON personer.id=a2.link_id AND a2.type='fax'
LEFT JOIN attributter a3 ON personer.id=a3.link_id AND a3.type='land'
Avatar billede steber Nybegynder
13. juli 2011 - 07:34 #2
Traditionelt har Oracle databasen aldrig selv kunnet lave en generisk pivot. Det virker næsten som om man har tænkt: "Hvordan kan et værktøj ovenpå Oracle også vise output hvis det ikke ved hvor mange kolonner der returneres?" Argumentet holder bare ikke fordi man har flere muligheder for at aflevere et resultset så aftageren samtidigt kan se/læse antal kolonner, datatyper etc.

Jeg skriver to ting: 1) Som jeg tidligere kunne have skrevet SQL'en, og 2) nogle af de nyere måder (PIVOT).

1)
Nå, men typisk har jeg klaret det, enten med fast eller dynamisk SQL, ved for hver af rækkerne i din Table1 at SELECT'e én CASE-sætning for hver af rækkerne i din Table1. Merarbejdet i form af CASE-sætninger betaler sig kun hvis Table2 er stor, for SQL'en som joiner én gang. Ex (pseudo SQL):
SELECT sub.id, sub.navn, max( sub.telefon) telefon, max( sub.fax) fax
FROM (
  SELECT
    p.id,
    p.navn,
    CASE WHEN a.type = 'Telefon' THEN a.text END telefon,
    CASE WHEN a.type = 'Fax' THEN a.text END fax
  FROM personer p, attributter a
  WHERE p.id = a.link_id
  ) sub
GROUP BY sub.id, sub.navn
ORDER BY ...

2)
Der er heldigvis sket noget i Oracle-verdenen de seneste år.
Hvis jeg var dig ville jeg kigge på dette link som opsummerer flere muligheder. Lad dig ikke forvirre af at hanflere steder skriver om den i forhold til dig omvendte problemstilling. Hvis det skal gå lidt hurtigt, gå videre til hans PIVOT-link:
http://www.dba-oracle.com/t_display_multiple_column_values_same_rows.htm
Avatar billede arne_v Ekspert
08. august 2011 - 00:55 #3
Tid at faa afsluttet her?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester