Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Drzewo znajomości.
Forum PHP.pl > Forum > Bazy danych > Microsoft SQL Server / MSDE
Morfina
Witam ponownie,
po raz kolejny zwracam się z prośbą o pomoc do gremium użytkowników tego forum z zadaniem, które spędza mi sen z powiek.

Dane


W tabeli widzimy dwie kolumny, Osoby 1 oraz Osoby 2, tabela przedstawia znajomości, czyli dla pierwszego rekordu osoba „a” zna osobę „1”. Widzimy także, że dla rekordu drugiego osoba „1” zna osobę „b” . Osoby „a,b,1” nie występują w żadnej innej znajomości czyli tworzą grupę 1 ( widzimy to w tabeli Wynikowej). Dla grupy trzeciej osoba „e” zna „3 i 4” a wiec grupa 3 obejmuje osoby „3,4,g,h,f,e”. Oczywiście jest to reprezentatywny przykład mojego problemu.

Z góry dziękuję za jakiekolwiek podpowiedzi.

Pozdrawiam Morf.
Morfina
Witam,
Dziękuję koledze za odpowiedź na mój post.
Mam nieco inne rozwiązanie, które całkiem skutecznie działa. Przyznam, że nie do końca ogarniam rozwiązanie zaproponowane powyżej . Ciekawe czy da się to jeszcze jakoś prościej rozwiązać questionmark.gif

ID_P to Osoba 1
ID_L to Osoba 2

  1. SELECT *, ROW_NUMBER() Over(ORDER BY ID_P) AS Grupa
  2. INTO #Temp_P
  3. FROM dbo.Powiazania;
  4. GO
  5.  
  6. -- Uruchamiamy kilka razy
  7. UPDATE #Temp_P SET #Temp_P.Grupa = T2.Grupa
  8. FROM #Temp_P INNER JOIN #Temp_P AS T2 ON (#Temp_P.ID_P = T2.ID_P) And (#Temp_P.Grupa > T2.Grupa)
  9. GO
  10.  
  11. UPDATE #Temp_P SET #Temp_P.Grupa = T2.Grupa
  12. FROM #Temp_P INNER JOIN #Temp_P AS T2 ON (#Temp_P.ID_L = T2.ID_L) And (#Temp_P.Grupa > T2.Grupa)
  13. GO
  14.  
  15. -- Na koniec
  16. SELECT ID_P,ID_L, DENSE_RANK() Over(ORDER BY Grupa) AS Ranking
  17. FROM #Temp_P;
  18. GO


Pozdrawiam
Morfina
juris
Twoje podejście jest proceduralne - tak jak pisałem wcześniej, to nie jest problem. W takim przypadku użyj pętli WHILE i sprawdzaj czy w danym kroku zostały zupdateowane rekordy czy nie (w końcu przy wielu relacjach nie będziesz tego klikał z palucha kilka (ile?) razy wink.gif).

Moje rozwiązanie to jedna kwerenda i jest uniwersalna (po rozszerzeniu na końcu o substring ( ID ) ).

Pozdrowienia !
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.