Собственно этот не хитрый скрипт необходимый для того чтобы найти имена персонажей которые так или иначе относятся к указанному персу. Поиск без учёта предметов и т.п., просто факт контакта по почте.
Сильно упрощает жизнь при расследовании дюпов/взломов.
Пример:
Перс A передал B, а тот в свою очередь C и D. Вас интересует кто относится к персу A и на кого стоит обратить внимание.
Скрипт даст пути:
/A/B/C/
/A/B/D/
Сам sql запрос:
Код:
DECLARE @StartName nvarchar(max) = 'You name'
; With Links ([serial], [sendname], [recvname], [level], [path], [used_serial]) AS (
select [serial]
,[sendname]
,[recvname]
,1 as [level]
,'/' + convert(nvarchar(max), rtrim([sendname])) + '/'
+ convert(nvarchar(max), rtrim([recvname])) + '/'
as [path]
,'/' + convert(nvarchar(max), [serial]) + '/' as [used_serial]
from [tbl_PostStorage]
where [sendname] = @StartName and [recvname] <> [sendname]
union all
select [tbl_PostStorage].[serial]
,[tbl_PostStorage].[sendname]
,CASE WHEN ROW_NUMBER() OVER (PARTITION BY [Links].[serial] ORDER BY [Links].[serial]) >= 1
THEN NULL
ELSE [tbl_PostStorage].[recvname] END AS [recvname]
,[Links].[level] + 1 as [level]
,[Links].[path] + rtrim([tbl_PostStorage].[recvname]) + '/'
,[Links].[used_serial] + convert(nvarchar(max), [tbl_PostStorage].[serial]) + '/'
from [Links]
INNER JOIN [tbl_PostStorage]
on [tbl_PostStorage].[sendname] = [Links].[recvname]
and [Links].[path] not like '%/' + rtrim([tbl_PostStorage].[recvname]) + '/%'
and [Links].[used_serial] not like '%/' + convert(nvarchar(max), [tbl_PostStorage].[serial]) + '/%'
where [tbl_PostStorage].[sendname] <> [tbl_PostStorage].[recvname]
)
Select distinct [path] from Links
order by [path]
Если есть замечания - велком. Тестилось на схеме таблице от GU