Umlüx
Huge Metal Fan
|
Ich habe eine Oracle Tabelle die simplifiziert so aussieht: 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: 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
|
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
|
reicht schnell und schmutzig? 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
|
Da find ich einen join über subselects schöner 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
|
noch schneller und schmutziger: 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
|
ah. ich verstehe worauf ihr da rauswollt. danke!
|