SQL再帰クエリ:RECURSIVE


🔭 プログラマーSQL質問:養子縁組の視点を探す(2)

私が初めて使ったコードは以下の通りです.
SELECT HOUR(DATETIME) AS HOUR, COUNT(ANIMAL_ID) AS COUNT 
FROM ANIMAL_OUTS 
GROUP BY HOUR 
HAVING HOUR BETWEEN 0 AND 23
ORDER BY HOUR;

まちがった理由


表に存在しない時間にもタグを付けます
しかし、例の正解は0から23時までで、値がない時間もありますが、私が書いた答えは統計がない時間では表現できません.これは提供されたテーブルでしか処理できない問題ではないと思います.どうやって解くの?幸いなことに、どう考えても答えはありません!私のような人が多すぎるのか、これまでに解いたプログラマーSQLの問題が一番多かった.

解決策


再帰クエリの使用
調査結果によると、最も簡単な答えを見つけるには、「再帰クエリ」を使用します.
再帰クエリについては何も知らなかったため,正しいコードをベースに,逆に概念に入ることにした.

正しいコード

WITH RECURSIVE TIME 
AS(
    SELECT 0 AS HOUR 
    UNION ALL 
    SELECT HOUR + 1 FROM TIME 
    WHERE HOUR < 23)

SELECT HOUR, COUNT(HOUR(DATETIME)) AS 'COUNT' 
FROM TIME
LEFT OUTER JOIN ANIMAL_OUTS
ON (HOUR = HOUR(DATETIME))
GROUP BY HOUR;

再帰クエリ


再帰クエリの概念を理解するために、MySQLtutorialの文書を参照してください.
# 재귀 쿼리로 테이블 만들기

WITH RECURSIVE cte_count (n)   # cte_count는 만들 테이블 명
AS(
  SELECT 1   # 초기값
  UNION ALL   # 위의 쿼리와 아래 쿼리의 값을 연산
  SELECT n + 1   # 값을 불러와 연산
  FROM cte_count   # 값을 불러올 테이블
  WHERE n < 3   # 연산을 멈출 조건절
)
# 재귀쿼리 사용 방법
SELECT n
FROM cte_count;   
この再帰クエリを使用して、TIMEというテーブルが作成され、結果は次のようになります.

正解から,HOURが0,1に等しい場合,値がなくても表に存在する.従って、LEFTOUTER JOINを用いて提供される表HOUR(DATETIME)GROUP BY HOURである.