[sql] WHERE 절에서 열 별명 참조

SELECT logcount, logUserID, maxlogtm
   , DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
WHERE daysdiff > 120

나는 얻다

“잘못된 열 이름 daysdiff”.

Maxlogtm은 날짜 / 시간 필드입니다. 나를 미치게하는 작은 것들입니다.



답변

SELECT
   logcount, logUserID, maxlogtm,
   DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
WHERE ( DATEDIFF(day, maxlogtm, GETDATE() > 120)

일반적으로 WHERE절 에서 필드 별명을 참조 할 수 없습니다 . ( SELECT별명을 포함 하여 전체 를 생각 하면 WHERE절 뒤에 적용됩니다 .)

그러나 다른 답변에서 언급했듯이 SQL SELECTWHERE절 보다 먼저 처리 되도록 강제 할 수 있습니다 . 이것은 일반적으로 논리 연산 순서를 강제하기 위해 괄호 나 CTE (Common Table Expression)로 수행됩니다.

괄호 / 하위 선택 :

SELECT
   *
FROM
(
   SELECT
      logcount, logUserID, maxlogtm,
      DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
   FROM statslogsummary
) as innerTable
WHERE daysdiff > 120

또는 CTE 버전에 대한 Adam의 답변을 참조하십시오.


답변

WHERE절 에서 별칭을 사용하려면 하위 선택 또는 CTE로 별칭 을 래핑해야합니다 .

WITH LogDateDiff AS
(
   SELECT logcount, logUserID, maxlogtm
      , DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
   FROM statslogsummary
)
SELECT logCount, logUserId, maxlogtm, daysdiff
FROM LogDateDiff
WHERE daysdiff > 120


답변

코드를 반복하지 않고 가장 효과적인 방법 은 WHERE 대신 HAVING을 사용하는 것입니다.

SELECT logcount, logUserID, maxlogtm
   , DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
HAVING daysdiff > 120


답변

CTE에 모든 열을 나열하지 않으려면 다른 방법으로 다음을 사용하십시오 outer apply.

select
    s.logcount, s.logUserID, s.maxlogtm,
    a.daysdiff
from statslogsummary as s
    outer apply (select datediff(day, s.maxlogtm, getdate()) as daysdiff) as a
where a.daysdiff > 120


답변

하위 쿼리를 사용하는 것은 어떻습니까 (Mysql에서 저에게 효과적이었습니다)?

SELECT * from (SELECT logcount, logUserID, maxlogtm
   , DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary) as 'your_alias'
WHERE daysdiff > 120


답변

HAVING은 설명서에 따라 MySQL에서 작동합니다.

HAVING 를 Where 키워드 집계 함수와 함께 사용할 수 없기 때문에 절은 SQL에 추가되었습니다.


답변

컬럼 별명을 참조 할 수 있지만 다음을 사용하여 정의해야합니다 CROSS/OUTER APPLY.

SELECT s.logcount, s.logUserID, s.maxlogtm, c.daysdiff
FROM statslogsummary s
CROSS APPLY (SELECT DATEDIFF(day, s.maxlogtm, GETDATE()) AS daysdiff) c
WHERE c.daysdiff > 120;

DBFiddle 데모

장점 :

  • 표현의 단일 정의 (복사-붙여 넣기를 유지하기가 더 쉬움)
  • CTE / 외부 쿼리로 전체 쿼리를 래핑 할 필요가 없습니다.
  • 언급 가능성 WHERE/GROUP BY/ORDER BY
  • 더 나은 성능 (단일 실행)