"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

Hilfe zu Oracle Select

Umlüx 06.07.2021 - 14:50 3494 5
Posts

Umlüx

Huge Metal Fan
Avatar
Registered: Jun 2001
Location: Kärnten
Posts: 8892
Ich habe eine Oracle Tabelle die simplifiziert so aussieht:

Code:
id partner type value
-------------------------
1  1       1    +43132456789
2  1       2    not @home.at
3  1       4    daheimstrasse 9

und suche ein SELECT nach "partner", welches mir die Daten so formatiert ausspucken würde:

Code:
partner email         telefon       adresse
------------------------------------------
1       not @home.at  +43132456789  daheimstrasse 9

ich wurschtel hier gerade schon mit IF und CASE herum, komm aber auf keinen grünen zweig.. wie kann ich das elegant lösen?

kleinerChemiker

Here to stay
Avatar
Registered: Feb 2002
Location: Wien
Posts: 4248
Ich bin nicht so bei Oracle daheim, aber wäre das nicht was für SELECT PIVOT? Eventuell mit einem JOIN auf eine Tabelle die dem Type einen Namen gibt.

meepmeep

Here to stay
Avatar
Registered: Feb 2006
Location: Wien
Posts: 2329
reicht schnell und schmutzig?
Code:
drop table partner;
create table PARTNER(
    id          number,
    type        number,
    value       varchar2(20char)
);

insert into partner values (1, 1, '+43132456789');
insert into partner values (1, 2, 'not @home.at');
insert into partner values (1, 4, 'daheimstrasse 9');

insert into partner values (2, 1, '123');
insert into partner values (2, 2, 'yes @home.at');
insert into partner values (2, 4, 'entenhausen');

select p.id, phone.value as phone, mail.value as mail, addr.value as addr from partner p
join partner phone on (p.id = phone.id and phone.type = 1)
join partner mail on (p.id = mail.id and mail.type = 2)
join partner addr on (p.id = addr.id and addr.type = 4)
group by p.id, phone.value, mail.value, addr.value;

        ID PHONE                MAIL                 ADDR                
---------- -------------------- -------------------- --------------------
         1 +43132456789         not @home.at         daheimstrasse 9     
         2 123                  yes @home.at          entenhausen       

Punisher

Bukanier
Avatar
Registered: Sep 2002
Location: Disneyland
Posts: 1857
Da find ich einen join über subselects schöner
Code:
create table partnercontact (id integer, partner integer, type integer, value varchar(100));
insert into partnercontact (id, partner, type, value) values (1, 1, 1, '+43132456789');
insert into partnercontact (id, partner, type, value) values (2, 1, 2, 'not @home.at');
insert into partnercontact (id, partner, type, value) values (3, 1, 4, 'daheimstrasse 9');
		
insert into partnercontact (id, partner, type, value) values (1, 2, 1, '+43242346789');
insert into partnercontact (id, partner, type, value) values (2, 2, 2, 'test@test.at');
insert into partnercontact (id, partner, type, value) values (3, 2, 4, 'test 9');
        
select tels.partner, tels.tel, addrs.addr, emails.email from
(select value as tel, partner from partnercontact where type = 1) tels
JOIN (select value as addr, partner from partnercontact where type = 2) addrs
ON tels.partner = addrs.partner
JOIN (select value as email, partner from partnercontact where type = 4) emails
ON tels.partner = emails.partner

edit

bei fehlenden Daten ev die Joins durch outer joins ersetzen
Bearbeitet von Punisher am 07.07.2021, 00:20

berndy2001

Komasäufer
Avatar
Registered: Feb 2003
Location: Vienna
Posts: 1931
noch schneller und schmutziger:

Code:
select distinct id,
(select value from partner b where type = 1 and a.id = b.id) tel,
(select value from partner b where type = 2 and a.id = b.id) mail,
(select value from partner b where type = 4 and a.id = b.id) street
from partner a
order by 1
http://sqlfiddle.com/#!4/120710/1

Umlüx

Huge Metal Fan
Avatar
Registered: Jun 2001
Location: Kärnten
Posts: 8892
ah. ich verstehe worauf ihr da rauswollt.
danke!
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz