SQL 서버 테이블에 URL 리디렉션 테이블이 있으며 리디렉션마다 ID, FromURL 및 ToURL 필드가 있습니다.리디렉션 체인의 시작과 끝 찾기
사용자가 여러 번이 아닌 한 번만 리디렉션되도록 단일 리디렉션으로 대체 할 수 있도록 표에서 일련의 리디렉션이있는 곳을 찾아야합니다.
테이블의 예는 다음과 같습니다
당신이 볼 수 있듯이, 사용자가 방문의 URL A는, 그들이 B로 리디렉션됩니다 있다면, B에서 C로 다음 C에서 D로 페이지로드 속도를 높이기 위해 A에서 D로 단일 리디렉션으로 바꾸고 싶습니다.
SELECT r.ID ,
r.FromURL ,
r.ToURL
FROM dbo.redirect r
WHERE fromURL NOT IN (SELECT ToURL
FROM dbo.redirect r2)
다음 각 체인의 시작을 찾을 수
은 내가 재귀 CTE와 커서없이이 작업을 수행 할 수있을 거라고 생각하지만이 완전히 붙어있어, 최고의 내가 관리 하였다
이렇게하면 FromURL이 다른 리디렉션에 의해 리디렉션되지 않은 레코드를 선택하여 체인 (또는 체인에없는 체인)의 시작을 알 수 있습니다. 재귀 CTE 예제를 통해 다음을 시도해 보았을 때, 결국 정크 데이터 나 재귀 한계가 발생했습니다. 당신이 볼 수 있듯이
, 리디렉션의 사슬이 하나 하나로 대체되었습니다, 그래서 모든 :
이상적으로이 나가 싶은 무엇을 다음과 같은 데이터는 레벨의 계층 구조는 이제 체인의 끝으로 직접 이동합니다.
나는 우리 웹 팀을 위해 뭔가를하기로 동의 한 DBA 일 뿐이며, 이제는 누군가가 나를 도와 줄 수 있다면 T-SQL에 대한 나의 능력을 완전히 잃어 버렸습니다.
당신은 테이블을 풀다운 수 있으며 다른 언어로합니까? –
그래, 내가 왜 다른 언어로하기가 더 쉽다면 나는 보지 않는다. 나는 그것을 보아서 기쁘다. 내가 익히 알고있는 유일한 언어는 C#이다. (주로 SQL CLR을 사용한다. 프로 시저),하지만 난 항상 뭔가 새로운 것을 시도하고 싶어 :-) – steoleary
당신은 C#을 사용하고 유향 그래프를 만들 수 있습니다. 그럼 당신은 연결이 끊어진 선으로 끝날 것이라고 생각합니다. 그것들을 가리 키지 않는 모든 노드를 찾아서 각 라인을 압축하여 처음에 모든 중간 노드를 저장하십시오. 이것은 당신이 메모리에 남아 있거나 재빨리 접근 할 수 있기 때문에 그것을 재 계산할 필요가 없다고 가정합니다. –