연결된 CTE에서 열 이름을 다시 입력하지 마십시오.

토탈

샘플 데이터

IF OBJECT_ID(N'tempdb..#Tmp') IS NOT NULL DROP TABLE #Tmp
CREATE TABLE #Tmp(id INT NOT NULL, date_time DATETIME NOT NULL, val1 INT, val2 INT)
INSERT INTO #Tmp 
VALUES (1, '2020-01-01 12:00:00.00', 1, 2),
       (2, '2020-01-01 13:00:00.00', 1, 2)

문제

n > 1열을 기반으로 일부 ( ) 계산 을 수행한다고 가정합니다 . 그러나, 나는 전에 손이 열을 변환해야합니다 (예를 들어에서 캐스팅 DATETIMEDATE). 다음과 같이 연결된 CTE를 쉽게 사용할 수 있습니다.

WITH trafo (date_only) AS (
   SELECT CAST(date_time as DATE) AS date_only 
     FROM #Tmp
 ), calc (next_week, prev_week) AS (
   SELECT DATEADD(DAY, 7, date_only) AS next_week
          , DATEADD(DAY, - 7, date_only) AS prev_week 
     FROM trafo
 )
SELECT * 
  FROM calc

이런 식으로 저는 CAST(date_time as DATE)한 번만 작성 하고 DATEADD부분 에서 반복 할 CAST필요가 없습니다. (이 특별한 경우에는 이것이 필요하지 않다는 것을 알고 있습니다 .하지만 그게 요점이 아닙니다. 일종의 변형).

그러나 다른 열도 유지하려면 모든 WITH에 복사해야합니다 . 이는 매우 지루해집니다 (특히 열이 꽤 있고 피하고 싶은SELECT * 경우 ).

WITH trafo (id, date_only, val1, val2) AS (
   SELECT id
          , CAST(date_time as DATE) AS date_only
          , val1
          , val2 
     FROM #Tmp
 ), calc (id, next_week, prev_week, val1, val2) AS (
   SELECT id
          , DATEADD(DAY, 7, date_only) AS next_week
          , DATEADD(DAY, - 7, date_only) AS prev_week 
          , val1
          , val2
     FROM trafo
 )
SELECT * 
  FROM calc

첫 번째 WITH에서 관련 열만 선택 JOIN하고 원래 테이블로 되돌릴 수 있습니다.

WITH trafo (id, date_only) AS (
   SELECT id
          , CAST(date_time as DATE) AS date_only 
     FROM #Tmp
 ), calc (id, next_week, prev_week, val1, val2) AS (
   SELECT trafo.id
          , DATEADD(DAY, 7, date_only) AS next_week
          , DATEADD(DAY, - 7, date_only) AS prev_week
          , val1
          , val2 
     FROM trafo
     JOIN #Tmp
       ON #Tmp.id = trafo.id
 )
SELECT * 
  FROM calc

그러나 이것은 나에게 (성능 측면에서) 매우 현명한 생각이 아닌 것 같습니다 (선택하는 것이 가입하는 것보다 저렴하다고 가정).

질문

원할 때이 문제에 어떻게 접근해야합니까?

ㅏ. 좋은 성능 *

비. 가능한 한 내 코드에서 반복이 적습니까?


* 나는 이것이 실제 사용 사례에 달려 있다는 것을 알고 있지만 불필요한 작업을 피한다는 의미입니다.

Lukasz Szozda

이 특정 시나리오는 사용 체인의 이상적인 경우 인 것 같습니다 CROSS/OUTER APPLY.

WITH trafo (id, date_only, val1, val2) AS (
   SELECT id
          , CAST(date_time as DATE) AS date_only
          , val1
          , val2 
     FROM #Tmp
 ), calc (id, next_week, prev_week, val1, val2) AS (
   SELECT id
          , DATEADD(DAY, 7, date_only) AS next_week
          , DATEADD(DAY, - 7, date_only) AS prev_week 
          , val1
          , val2
     FROM trafo
 )
SELECT * 
  FROM calc

된다 :

SELECT  t.id
      , t.val1
      , t.val2
      , s1.date_only
      , s2.next_week
      , s2.prev_week
FROM #Tmp t
CROSS APPLY (SELECT CAST(t.date_time as DATE) AS date_only) AS s1
CROSS APPLY (SELECT DATEADD(DAY, 7, s1.date_only) AS next_week,
                    DATEADD(DAY, - 7, s1.date_only) AS prev_week) AS s2

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

laravel에서 열 이름을 연결하십시오.

분류에서Dev

AngularJS에서 문자열을 연결할 때 null을 표시하지 마십시오.

분류에서Dev

결과에서 ID 배열을 가져 오지 마십시오 (mssql-node.js)

분류에서Dev

업데이트 후 Firebase에 연결하지 마십시오.

분류에서Dev

배열에서 동일한 항목을 출력하지 마십시오.

분류에서Dev

배열에 입력 한 입력이 올바른지 / 잘못된 지 확인하십시오.

분류에서Dev

onClick이 지정된 동안 href를 열지 마십시오 (react js에서)

분류에서Dev

알려진 열 팬더에 이름이 지정된 열에 값을 삽입하십시오.

분류에서Dev

React Native Elements에서 비활성화 된 입력을 회색으로 표시하지 마십시오.

분류에서Dev

자바 스크립트의 문자열에서 전체 이름을 분리하지 마십시오.

분류에서Dev

두 파일 사이에서 발견 된 경우 동일한 문자열을 다시 인쇄하지 마십시오.

분류에서Dev

Proguard에서 하드 코딩 된 문자열을 난독 화하지 마십시오.

분류에서Dev

그들 중 하나에서 다른 열을 결합하십시오-파이썬

분류에서Dev

SQL 삽입에서 미리 정의 된 값을 반복하지 마십시오.

분류에서Dev

1로 설정된 경우 열을 업데이트하지 마십시오.

분류에서Dev

ng-blur에서 입력에 연결된 모델을 업데이트하고 있지만 입력이 초점을 다시 가정합니다.

분류에서Dev

PHP에서 다차원 배열에 값을 입력하십시오.

분류에서Dev

'배열'을 사용할 수 없습니다 : 지연 시퀀스에서 배열을 생성하십시오 : Array (...) *

분류에서Dev

변수 내에서 문자열을 확장하지 마십시오.

분류에서Dev

목록에 입력하려면 null을 사용하지 마십시오.

분류에서Dev

입력을 동적으로 배치하고 다른 요소에서 반복하지 마십시오.

분류에서Dev

혼란 : 문자열은 변경 불가능하므로 연결에 사용하지 마십시오.

분류에서Dev

다차원 JSON 객체에서 배열 (및 [0])을 사용하지 마십시오.

분류에서Dev

이 계산에서 파이썬 "마법"을 해결하십시오

분류에서Dev

동일한 입력을 두 번 입력하지 마십시오.

분류에서Dev

angularjs, 입력 필드에 입력 제출하지 마십시오

분류에서Dev

grunt htmlmin : gruntfile.js에 파일 이름을 지정하지 마십시오.

분류에서Dev

1에서 3까지의 숫자로 된 팬더 열을 만들고 다시 반복하십시오.

분류에서Dev

PHP 배열에서 이중을 확인하고 마지막을 삭제하십시오.

Related 관련 기사

  1. 1

    laravel에서 열 이름을 연결하십시오.

  2. 2

    AngularJS에서 문자열을 연결할 때 null을 표시하지 마십시오.

  3. 3

    결과에서 ID 배열을 가져 오지 마십시오 (mssql-node.js)

  4. 4

    업데이트 후 Firebase에 연결하지 마십시오.

  5. 5

    배열에서 동일한 항목을 출력하지 마십시오.

  6. 6

    배열에 입력 한 입력이 올바른지 / 잘못된 지 확인하십시오.

  7. 7

    onClick이 지정된 동안 href를 열지 마십시오 (react js에서)

  8. 8

    알려진 열 팬더에 이름이 지정된 열에 값을 삽입하십시오.

  9. 9

    React Native Elements에서 비활성화 된 입력을 회색으로 표시하지 마십시오.

  10. 10

    자바 스크립트의 문자열에서 전체 이름을 분리하지 마십시오.

  11. 11

    두 파일 사이에서 발견 된 경우 동일한 문자열을 다시 인쇄하지 마십시오.

  12. 12

    Proguard에서 하드 코딩 된 문자열을 난독 화하지 마십시오.

  13. 13

    그들 중 하나에서 다른 열을 결합하십시오-파이썬

  14. 14

    SQL 삽입에서 미리 정의 된 값을 반복하지 마십시오.

  15. 15

    1로 설정된 경우 열을 업데이트하지 마십시오.

  16. 16

    ng-blur에서 입력에 연결된 모델을 업데이트하고 있지만 입력이 초점을 다시 가정합니다.

  17. 17

    PHP에서 다차원 배열에 값을 입력하십시오.

  18. 18

    '배열'을 사용할 수 없습니다 : 지연 시퀀스에서 배열을 생성하십시오 : Array (...) *

  19. 19

    변수 내에서 문자열을 확장하지 마십시오.

  20. 20

    목록에 입력하려면 null을 사용하지 마십시오.

  21. 21

    입력을 동적으로 배치하고 다른 요소에서 반복하지 마십시오.

  22. 22

    혼란 : 문자열은 변경 불가능하므로 연결에 사용하지 마십시오.

  23. 23

    다차원 JSON 객체에서 배열 (및 [0])을 사용하지 마십시오.

  24. 24

    이 계산에서 파이썬 "마법"을 해결하십시오

  25. 25

    동일한 입력을 두 번 입력하지 마십시오.

  26. 26

    angularjs, 입력 필드에 입력 제출하지 마십시오

  27. 27

    grunt htmlmin : gruntfile.js에 파일 이름을 지정하지 마십시오.

  28. 28

    1에서 3까지의 숫자로 된 팬더 열을 만들고 다시 반복하십시오.

  29. 29

    PHP 배열에서 이중을 확인하고 마지막을 삭제하십시오.

뜨겁다태그

보관