>

다음과 같은 결과를 얻습니다

C1     C2   C3
10     2    T
10     3    E
10     6    S

결과 레코드가 다음과 같은 방식으로 SELECT 쿼리를 원합니다

C1     C2   C3
10     2    T
10     3    E
10     4
10     5
10     6    S

누락 된 레코드에 빈 줄이있는 경우. 같은 것을 알 수 없습니다.

원래 쿼리 : select C1, C2,C3 from Table  

  • 답변 # 1

    mysql 버전이 8.0보다 높으면 cte RECURSIVE를 사용하여 달력 테이블을 만든 다음 outer join 를 수행하십시오.

    스키마 (MySQL v8.0)

    CREATE TABLE T(
      C1 int, 
      C2 int,
      C3 varchar(5)
    );
    
    INSERT INTO T VALUES (10,2,'T');
    INSERT INTO T VALUES (10,3,'E');
    INSERT INTO T VALUES (10,6,'S');
    
    

    <시간>

    질문 # 1

    WITH RECURSIVE CTE AS (
        SELECT C1,MIN(C2) minC2,MAX(C2) maxC2
        FROM T
        GROUP BY C1
        UNION ALL 
        SELECT C1,minC2 +1,maxC2
        FROM CTE
        WHERE minC2+1 <= maxC2
    )
    SELECT t1.C1,t1.minC2,t2.C3
    FROM CTE t1 LEFT JOIN T t2 on t1.minC2 = t2.C2
    ORDER BY C1,minC2;
    | C1  | minC2 | C3  |
    | --- | ----- | --- |
    | 10  | 2     | T   |
    | 10  | 3     | E   |
    | 10  | 4     |     |
    | 10  | 5     |     |
    | 10  | 6     | S   |
    
    

    <시간>

    DB Fiddle에서보기

  • 답변 # 2

    데이터베이스에 순차 번호 테이블을 생성 한 다음 외부 조인을 사용하여 C2의 누락 된 행 값을 채울 수 있습니다. 다른 쿼리에도 매우 유용하며 공간이 거의 없습니다.

    CREATE TABLE Numbers (Number INTEGER PRIMARY KEY);
    INSERT INTO Numbers (Number) VALUES (1),(2),(3),(4),(5),(6) ...
    
    

    그리고 :

    SELECT T.C1, N.Number AS C2, T.C3 
    FROM Numbers AS N LEFT OUTER JOIN T ON T.C2 = N.Number
    WHERE N.Number BETWEEN (SELECT MIN(C2) FROM T) AND (SELECT MAX(C2) FROM T)
    ORDER BY C2;
    
    

    HTH

관련 자료

  • 이전 c++ - 내림차순으로 배열을 오름차순으로 인쇄
  • 다음 c++ - dx [dir에 대해 {1, 1, 0, -1, -1, -1, 0, 1} 및 {0, 1, 1, 1, 0, -1, -1, -1} 값이 선택된 이유 ] 그리고 dy [dir]?