ms sql for path

Ateis

Guru
13. sep 2007
2.306
821
113
Problem sledeč: dve tabeli, ki sta v relaciji one2many. Torej vsak zapis v tabeli A ima več zapisov v tabeli B. Tabela C je fšifrant držav in v relaciji z tabelo B.

tabela A (id_izvedbe, id_drzave)
tabela B (id_drzave, drzava)
tabela C (drzava, ime_drzave)

Rad bi, da bi za vsak A.id_izvedbe v eni vrstici dobil vse zapise v kolonah za C.ime_drzave.

nekako sem našel rešitev, samo je ne znam implementirat,ker je toliko možnih odgovorov (http://stackoverflow.com/questions/451415/simulating-group-concat-mysql-function-in-ms-sql-server-2005).

Se komu sanja katera rešitev je najbolj simpl za moj primer? Naj bi uporabil funkcijo FOR XML PATH, ampak ni mi jasno kako.
 
Nazadnje urejeno:

Slick

Majstr
18. sep 2007
2.286
196
63
Težko je takole na suho direkt zadet, ampak jaz bi naredil nekako takole:

Koda:
SELECT A.id_izvedbe, 
  STUFF ((SELECT ', ' + C.ime_drzave
  FROM TabelaC C
  JOIN TabelaB B ON B.drzava=C.drzava
  WHERE B.id_drzave=A.id_drzave
  ORDER BY C.ime_drzave
  FOR XML PATH('') ),1,2,'') AS Countries
FROM TabelaA A
GROUP BY A.id_izvedbe
 

Ateis

Guru
13. sep 2007
2.306
821
113
thx, mi je ratal.
nahrung002.gif


Koda:
SELECT DISTINCT u.udelezenec, a.izvedba, a.datum, a.starost, i.naziv, u.spol, u.rojen , STUFF (
	   (SELECT ',' + sd.naziv
		FROM s_drzava sd
		LEFT OUTER JOIN dz_dn_adrzava ad ON ad.drzava = sd.drzava
		WHERE ad.delovni_nalog = a.izvedba FOR XML PATH('')),1 ,1 ,'') AS drzava
FROM dz_ambulanta a, dz_izobrazba i, dz_udelezenec u
WHERE a.izobrazba = i.izobrazba AND a.udelezenec = u.udelezenec
ORDER BY a.izvedba
 

Ateis

Guru
13. sep 2007
2.306
821
113
5*

To je pa tko, če delaš sto različnih stvari. Vse znaš, pa nč dobr. Sicer sam uporabljam ponavadi ANSI SQL, tko da teh dodatnih uporabnih funkcij ,ki jih imajo posgresql, mssql, mysql ne poznam. So pa te funkcije res kul, ker ti lahko prihranijo dosti časa. Razn če morš pol prepisat program za kakšno drugo bazo, maš pa mal več dela da popraviš.

lp