SQL Server 하위 쿼리
두 개의 SQL 쿼리를 결합하고 싶습니다. 첫 번째 쿼리는 최근 달의 직원 레코드를 풀백하고 두 번째 쿼리는 지난 3 개월 동안의 레코드를 풀백합니다.
광기에 대한 방법이 있습니다. 직원들은 매달 관리자를 변경할 수 있지만, 최근 달의 관리자는 해당 직원이 해당 달 동안 다른 관리자를 가졌더라도 해당 직원의 이전 3 개월 기록을 확인해야합니다.
이것은 최근 달에 가져올 첫 번째 선택입니다.
/******latest month*****************/
SELECT [REPORT_DT]
,[EMPLOYEE_ID]
,[EMPLOYEE_NAME]
,[LOCATION]
,[JOB_DESCRIPTION]
,[MANAGER_ID]
FROM [EMPLOYEE]
where [REPORT_DT]=
(select max([REPORT_DT]) from [EMPLOYEE])
이것은 지난 3 개월 동안 가져 오기위한 선택입니다.
/*********last 3 months*******************/
SELECT [REPORT_DT]
,[EMPLOYEE_ID]
,[EMPLOYEE_NAME]
,[LOCATION]
,[JOB_DESCRIPTION]
,[MANAGER_ID]
FROM [EMPLOYEE]
where [REPORT_DT]>=
( DATEADD(M, -3, GETDATE()))
저는 [EMPLOYEE_ID]에서 2 명의 선택에 합류 할 것입니다. 이 두 쿼리를 결합하는 방법에 대한 아이디어가 있습니까? 감사!
답변
두 테이블을 조인하려면 다음을 사용합니다.
select ecurr.*, e.* -- or whatever columns you like
from employee ecurr join
employee e
on ecurr.employee_id = e.employee_id
where ecurr.report_dt = (select max(e2.report_dt) from employee e2) and
e.report_dt >= dateadd(month, 3, getdate())
order by ecurr.employee_id, e.report_dt;
이 결과는 나에게 특별히 의미가 없다고 덧붙일 것입니다. 그러나 이것은 당신이 구체적으로 물은 질문입니다.
다음을 사용합니다.
SELECT TOP 1 WITH TIES
[REPORT_DT],
[EMPLOYEE_ID],
[EMPLOYEE_NAME],
[LOCATION],
[JOB_DESCRIPTION],
[MANAGER_ID],
FROM [EMPLOYEE]
WHERE
[REPORT_DT] >= DATEADD(M, -3, GETDATE()
ORDER BY
[REPORT_DT] DESC;
위의 WHERE절은 두 번째 쿼리와 일치 하며 테이블에서 TOP 1 WITH TIES최대 REPORT_DT값을 갖는 레코드를 가져 오는 방법을 사용 합니다.
다음을 사용할 수도 있습니다 EXISTS.
SELECT [REPORT_DT]
,[EMPLOYEE_ID]
,[EMPLOYEE_NAME]
,[LOCATION]
,[JOB_DESCRIPTION]
,[MANAGER_ID]
FROM [EMPLOYEE]
WHERE [REPORT_DT] = (SELECT MAX([REPORT_DT]) FROM [EMPLOYEE]) AND
EXISTS( SELECT 1 FROM [EMPLOYEE]
WHERE [EMPLOYEE_ID] == t.[EMPLOYEE_ID] AND
[REPORT_DT] >= (DATEADD(M, -3, GETDATE())))
주석과 관련하여이 쿼리는 문제를 해결해야합니다.
SELECT [REPORT_DT]
,[EMPLOYEE_ID]
,[EMPLOYEE_NAME]
,[LOCATION]
,[JOB_DESCRIPTION]
,[MANAGER_ID]
FROM [EMPLOYEE]
WHERE [REPORT_DT] >= (DATEADD(M, -3, GETDATE())) AND
EXISTS( SELECT 1 FROM [EMPLOYEE]
WHERE [EMPLOYEE_ID] == t.[EMPLOYEE_ID] AND
[REPORT_DT] >= (DATEADD(M, -1, GETDATE())))
최근 달의 [EMPLOYEE_ID] 명단을 받고 싶다고 생각했습니다. 그리고 그들의 3 개월 근로 기록을 얻으십시오. 현재 선택 스크립트에 따르면 (직원 목록을 제공하는지 여부에 관계없이 첫 번째 선택 스크립트를 이해하지 못했습니다) 이렇게 할 수 있습니다. 그러나 효과적인 해결책은 아닙니다. 조인 섹션에서 하위 선택을 추가 할 수도 있습니다. 먼저 이것을 시도하십시오.
SELECT [REPORT_DT]
,[EMPLOYEE_ID]
,[EMPLOYEE_NAME]
,[LOCATION]
,[JOB_DESCRIPTION]
,[MANAGER_ID]
FROM [EMPLOYEE]
where [REPORT_DT]>=(DATEADD(M, -3, GETDATE()))
AND [EMPLOYEE_ID] IN (SELECT [REPORT_DT]
,[EMPLOYEE_ID]
,[EMPLOYEE_NAME]
,[LOCATION]
,[JOB_DESCRIPTION]
,[MANAGER_ID]
FROM [EMPLOYEE]
where [REPORT_DT]=
(select max([REPORT_DT]) from [EMPLOYEE]))
아래 쿼리를 사용하여보기를 만든 다음이를 3 개월 날짜 프롬프트 (Business Objects 보고서에 사용됨)와 결합하여 트릭을 수행했습니다.
SELECT
b.[MANAGER_ID],
a.[EMPLOYEE_ID],
a.[START_DT],
a.[EMPLOYEE_NAME],
a.[LOCATION],
a.[JOB_DESCRIPTION],
a.[REPORT_DT]
FROM [EMPLOYEE] b INNER JOIN
[EMPLOYEE] a
ON b.[EMPLOYEE_ID] = a.[EMPLOYEE_ID]
WHERE b.[REPORT_DT] = (SELECT MAX(c.[REPORT_DT])
FROM [EMPLOYEE] c)