• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

export z SQL do XML nie potrafię zrobić subquery

Mały hosting, OGROMNE możliwości
+1 głos
161 wizyt
pytanie zadane 15 lutego w SQL, bazy danych przez matrixmm Nowicjusz (130 p.)

Cześć, to mój debiut więc bardzo proszę o wyrozumiałość. Na wstępie pozdrawiam wszystkich forumowiczów.

Potrzebuje pomocy przy eksporcie bazy sql do XML.

Mam dwie przykładowe tabele: klienci

i telefony: 

 

Tworzę zapytanie:

select top (3)
'true' AS 'AKTYWNY',
	k.nazwisko  AS 'NAZWISKO',
	k.imie AS 'IMIE',
	tel.nazwa AS 'TELEFONY/TELEFON/@rodzaj',
	tel.numer AS 'TELEFONY/NUMER'

FROM test.dbo.klienci k LEFT JOIN test.dbo.telefony tel on k.klient_id = tel.klient_id

FOR XML PATH('KLIENT'), ROOT ('BAZA')

i w wyniku dostaję 3 osobne rekordy. W każdym po jednym numerze telefonu.

Nie potrafię skonstruować subquery tak, aby otrzymać jeden rekord z trzema telefonami.

Czyli coś takiego:

<BAZA>
  <KLIENT>
    <AKTYWNY>true</AKTYWNY>
    <NAZWISKO>Kowalski</NAZWISKO>
    <IMIE>Jan</IMIE>
    <TELEFONY>
            <TELEFON rodzaj="komórka" />
            <NUMER>1231234</NUMER>
            <TELEFON rodzaj="VoIP" />
            <NUMER>4455667</NUMER>
            <TELEFON rodzaj="fax" />
            <NUMER>55443355</NUMER>
    </TELEFONY>
  </KLIENT>
</BAZA>

 

Będę wdzięczny za wszelką pomoc. 

1 odpowiedź

+1 głos
odpowiedź 25 lutego przez areklipno Stary wyjadacz (11,990 p.)

Trochę podpowiem - może pomoże przejść dalej (testowane na sqlfiddle). Nie znam się na tym tak dobrze, ale wydaje mi się, że wystarczy trochę doszlifować.
 

-- INIT database
CREATE TABLE Klienci (
  id INT IDENTITY(1, 1),
  name VARCHAR(100),
);

INSERT INTO Klienci(name) VALUES ('Klient A');
INSERT INTO Klienci(name) VALUES ('Klient B');

CREATE TABLE Telefony (
  id INT IDENTITY(1, 1),
  numer VARCHAR(20),
  klient_id int
  );

insert into Telefony (numer, klient_id) values ('123456789', 1);
insert into Telefony (numer, klient_id) values ('987654321', 2);
insert into Telefony (numer, klient_id) values ('876543219', 2);
insert into Telefony (numer, klient_id) values ('765432198', 2);

Select k.id, k.name, 
   (select t.numer 
     from Telefony t 
     where k.id = t.klient_id
  FOR XML PATH(''), ROOT('telefony'), TYPE) as numery
from Klienci k
FOR XML PATH('klient'), ROOT('klienci');
komentarz 22 marca przez matrixmm Nowicjusz (130 p.)
edycja 22 marca przez matrixmm

Cudownie, wielkie dzięki.
Już prawie.

teraz w wyniku mam już telefony:

      <telefony>
        <numer>987654321</numer>
        <numer>876543219</numer>
        <numer>765432198</numer>
      </telefony>

Bez problemu zrobię: 

ale to nie do końca ok. Finalnie chciałbym:

<TELEFONY>
 <Kontakt Typ="Telefon" Podstawowy="true" >
            <TELEFON rodzaj="komórka" />
            <NUMER>1231234</NUMER>
 </Kontakt>  
 <Kontakt Typ="Telefon" Podstawowy="true" >       
            <TELEFON rodzaj="VoIP" />
            <NUMER>4455667</NUMER>
 </Kontakt>
 <Kontakt Typ="Telefon" Podstawowy="true" >            
            <TELEFON rodzaj="fax" />
            <NUMER>55443355</NUMER>
 </Kontakt>
</TELEFONY>

Podobne pytania

0 głosów
0 odpowiedzi 147 wizyt
pytanie zadane 1 czerwca 2016 w Offtop przez Hadamalush Obywatel (1,880 p.)
0 głosów
1 odpowiedź 286 wizyt
0 głosów
0 odpowiedzi 813 wizyt
pytanie zadane 17 sierpnia 2016 w SQL, bazy danych przez onlyone Nowicjusz (120 p.)

93,715 zapytań

142,629 odpowiedzi

323,261 komentarzy

63,259 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...