[MSSQL] Widok zmaterializowany z podzapytaniem

0

Tabela Firma (Id, Nazwa) i Pracownik (Id, IdFirmy, Nazwisko)
Chcę napisać zapytanie, które wybierze nazwę firmy i nazwiska wszystkich jej pracowników oddzielone przecinkami (jeden wiersz dla każdej firmy).

Zrobiłem to (bazując na jakimś przykładzie z Google) na razie tak:

SELECT DISTINCT F.Id AS FirmaId, F.Nazwa AS NazwaFirmy, 
    (SELECT ISNULL(P2.Nazwisko,'') + ', ' 
		FROM dbo.Pracownik P2 
		INNER JOIN dbo.Firma F2 ON F2.Id = P2.IdFirmy
		WHERE P2.IdFirmy= P.IdFirmy
		FOR XML PATH('') ) AS NazwiskaPracownikow
    
FROM dbo.Firma AS F 
	LEFT JOIN dbo.Pracownik AS P ON F.Id = P.IdFirmy

Tylko jest jeden problem - to ma być zapytanie używane w widoku with schemabinding, a na FirmaId ma być założony sklastrowany indeks. I tu jest właśnie problem, bo nie da się takiego zrobić, gdy w zapytaniu są podzapytania.

Ma ktoś pomysł jak to rozwiązać?

0

ciezka spraw, probowalem kilka query jako view, ale zawsze marudzil przy utworzeniu indexu, a to left join, a to cross apply, a to CTE, a to podzapytanie

a potrzebujesz dla wielu firm na raz pokazywac liste nazwisk?
bo jesli tylko dla kilku i nazwisk nie jest w setkach czy tysiacach, to wybieranie tego w locie lub view bez indexu tez bedzie smigalo

0

Ten widok będzie używany przez Full-Text Search, dlatego chodzi o kwestie wydajnościowe.

0

Nie mam pomysłu. W widokach ze schemabinding nie można używać ani podzapytań, ani funkcji niedeterministycznych, ani widoków, a to bardzo ogranicza pole manewru.

0

Przyznam, że byłeś jednym z faworytów w tej sprawie, więc jestem zawiedziony. :(

Na razie zrobiłem tabelę, procedurę i chyba będę musiał napisać triggery albo skonfigurować joba. Mam tylko nadzieję, że to będzie akceptowalne dla użytkowników.

0

Mozesz zrobif funkcje, ale jesli silnik stwierdzi, ze jest niedeterministyczna, to tez Ci sie nie uda. Ja swego czasu tez to rozkminialem, choc u mnie chodzilo o kwestie polaczenia kilku danych dla kazdego z kilkudziesieciu tysiecy wierszy, wiec normalne zastosowania troche padaly przy tym (w szczegolnosci funkcja). Polecam zastosowanie funkcji .netowej, w msdnie jest akurat taki przyklad dla wlasnego agregatu :) Hula az milo :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1