2014-02-27 3 views
0

새로운 SQL 데이터베이스 시나리오에 직면하고 있습니다. 정말 간단한 대답이있을 것이라고 확신합니다. 그러나 나는 그것에 대해 머리로 생각할 수 없습니다. 나는 최대한 구체적으로 노력할 것입니다 ...연결된 레코드 반환 및 여러 하위 쿼리/루프 방지

고객은 우리 DB에 많은 별도의 애플릿이있을 것입니다. 이러한 애플릿은 일회성이거나 일련의 방문으로 연결될 수 있습니다. 특정 Appointment 이벤트를 찾고이 이벤트에 연결된 모든 약속을 Microsoft SQL 데이터베이스 2008 R2 DB에서 찾으려고합니다. 쿼리 결과에서 각 연결된 appt를 별도의 행으로 보는 것이 이상적입니다.

전체 Appts 세부 정보는 표 1에 있습니다 ("Appt"라고 함). Appt와 사이의 링크는 이전 Appt 만 (표 2) ("ApptLink")에 있습니다. ApptLink 테이블에는 ApptId가 FK로, 이전에 연결된 ApptId (FK)가 sperate 열에 포함됩니다.

예 : 데이터

APPT 표

ApptId (PK)를 샘플 날짜 시간, EVENTTYPE, 기간, 주석 apptstatus 위치

ApptLink 테이블

PK, ApptId (FK) PreviousApptId (FK)

다른 방법으로 시도해 보겠습니다. 나는 아무 문제도 찾고있는 주 appt를 반환 할 수 있지만, 이전 appt를 찾고 싶을 때, 이전 ApptId만을 보여줄 Apptlink 테이블에 가입해야하고, 이전 appt를 찾을 필요가있다. 그 apptlink 테이블에서 id를 찾아 previousapptid 등등 ... 나는 내가 가지고있을 수있는 appt의 결과를 반환하기 위해 Subquery/loop를 실행할 필요가 있다고 생각한다. 30 개의 링크 된 애플릿.

아래와 같은 것을 만들기 시작했는데, 30 가지 하위 쿼리를 실행하는 것보다 간단하고 빠른 방법이 있어야합니다. 나는 null이 반환 될 때까지 하위 쿼리의 힙을 생성하여 모든 previousapptIds를 가져올 필요가 있다고 느낀다. 즉, 더 이상 연결된 previousapptIds가 없다는 것을 의미한다.

Select * 
From Appt 
Where ApptId in (Select Appt.ApptId, ApptLink.PreviousApptId 
       From Appt 
       LEFT OUTER JOIN ApptLink ON Appt.ApptId=ApptLink.ApptId 
       Where Appt.Apptevent = 'Finish' and Appt.DateTime = '2014-3-1' 
       UNOIN 
       Select ApptLink2.PreviousApptId 
       From AppLink ApptLink2 
       Where ApptLink2.ApptId = ApptLink.PreviousApptId --(from above?) 
       UNOIN 
       Select ApptLink3.PreviousApptId 
       From AppLink ApptLink3 
       Where ApptLink3.ApptId = ApptLink2.PreviousApptId --(from above?) 

       --and so on for 30+ times... 

       ) 

정말 고맙습니다.

Josh.

답변

0

재귀 쿼리와 비슷합니다. 여기에 CTE (Common Table Expressions)를 사용하여 SQL Server에서 수행 한 작업을 읽을 수 있습니다. http://technet.microsoft.com/en-us/library/ms186243(v=sql.105).aspx

+0

감사합니다. Ownen - 전에는이 문제를 발견하지 못했지만 도움이 될 것 같습니다. 다른 사람이 같은 보트에있을 경우 내 솔루션을 게시하려고합니다. – user3360150

관련 문제