복붙노트

[SQL] SELECT 절에서 여러 설정을 돌려주는 기능을위한 예상되는 동작은 무엇인가?

SQL

SELECT 절에서 여러 설정을 돌려주는 기능을위한 예상되는 동작은 무엇인가?

예를 보려면, 나는 두 세트 - 리턴하는 함수의 결과와 "크로스 조인을"얻으려고하지만, 어떤 경우에는 내가 "크로스 가입"하지 않습니다

동작 1 : 세트의 길이가 동일한 경우, 각 세트의 항목으로 항목을 일치

postgres=# SELECT generate_series(1,3), generate_series(5,7) order by 1,2;
 generate_series | generate_series 
-----------------+-----------------
               1 |               5
               2 |               6
               3 |               7
(3 rows)

행동 2 : 세트의 길이가 다른 경우, 그것은 "크로스 조인"는 세트에요

postgres=# SELECT generate_series(1,2), generate_series(5,7) order by 1,2;
 generate_series | generate_series 
-----------------+-----------------
               1 |               5
               1 |               6
               1 |               7
               2 |               5
               2 |               6
               2 |               7
(6 rows)

나는 깡통 누군가가 예상되는 동작을 설명 내가 여기없는 이해 뭔가를 생각 해요?

또 다른 예를 들어, 심지어 괴상 :

postgres=# SELECT generate_series(1,2) x, generate_series(1,4) y order by x,y;
 x | y 
---+---
 1 | 1
 1 | 3
 2 | 2
 2 | 4
(4 rows)

내가 이상적으로 문서 링크 (들)로, 제목에 질문에 대한 답을 찾고 있어요.

해결법

  1. ==============================

    1.작은 세트 (들)에 대해 NULL 값을 추가한다. generate_series와 데모 () :

    작은 세트 (들)에 대해 NULL 값을 추가한다. generate_series와 데모 () :

    SELECT generate_series( 1,  2) AS row2
         , generate_series(11, 13) AS row3
         , generate_series(21, 24) AS row4;
    
    row2 | row3 | row4
    -----+------+-----
       1 |   11 |   21
       2 |   12 |   22
    null |   13 |   23
    null | null |   24
    

    여기 dbfiddle

    포스트 그레스 (10)에 대한 매뉴얼 :

    이것은 전통적으로 이상한 행동을 종료합니다.

    결과 행의 수 (다소 의외로!) 동일한 SELECT 목록의 모든 세트들의 최소 공배수이다. 데모 (! 모든 설정-크기에 더 공약수가없는 경우에만 가입 십자가 같은 역할) :

    SELECT generate_series( 1,  2) AS row2
         , generate_series(11, 13) AS row3
         , generate_series(21, 24) AS row4;
    
    row2 | row3 | row4
    -----+------+-----
       1 |   11 |   21
       2 |   12 |   22
       1 |   13 |   23
       2 |   11 |   24
       1 |   12 |   21
       2 |   13 |   22
       1 |   11 |   23
       2 |   12 |   24
       1 |   13 |   21
       2 |   11 |   22
       1 |   12 |   23
       2 |   13 |   24
    

    여기 dbfiddle

    포스트 그레스 9.6 장에 대한 매뉴얼에 문서화 세트 반환 SQL 함수

  2. ==============================

    2.나는이에 대한 모든 문서를 찾을 수 없습니다. 그러나, 나는 내가 관찰하는 동작을 설명 할 수 있습니다.

    나는이에 대한 모든 문서를 찾을 수 없습니다. 그러나, 나는 내가 관찰하는 동작을 설명 할 수 있습니다.

    설정된 생성 함수 각 리턴 행 유한 수. 모두가 다시 첫 행에있을 때 또는, 가능성 정지 - 포스트 그레스 그들 모두가 자신의 마지막 행에 때까지 세트 생성 기능을 실행하는 것 같다. 기술적으로,이 시리즈의 길이의 최소 공배수 (LCM) 일 것이다.

    나는이 경우 이유를 모르겠어요. 내가 코멘트에서 말하는 것처럼 그리고, 나는 일반적으로 절에서의 기능을 넣어 더 나은 생각합니다.

  3. ==============================

    3.설명서의 문제에 대한 유일한 참고가있다. 나는이 설명 된 동작을 설명 여부 확실하지 않다. 아마도 더 중요한 것은 이러한 기능 사용이되지 않습니다이다 :

    설명서의 문제에 대한 유일한 참고가있다. 나는이 설명 된 동작을 설명 여부 확실하지 않다. 아마도 더 중요한 것은 이러한 기능 사용이되지 않습니다이다 :

  4. from https://stackoverflow.com/questions/39863505/what-is-the-expected-behaviour-for-multiple-set-returning-functions-in-select-cl by cc-by-sa and MIT license