SQL再帰クエリ:RECURSIVE
5620 ワード
🔭 プログラマーSQL質問:養子縁組の視点を探す(2)
私が初めて使ったコードは以下の通りです.
表に存在しない時間にもタグを付けます
しかし、例の正解は0から23時までで、値がない時間もありますが、私が書いた答えは統計がない時間では表現できません.これは提供されたテーブルでしか処理できない問題ではないと思います.どうやって解くの?幸いなことに、どう考えても答えはありません!私のような人が多すぎるのか、これまでに解いたプログラマーSQLの問題が一番多かった.
再帰クエリの使用
調査結果によると、最も簡単な答えを見つけるには、「再帰クエリ」を使用します.
再帰クエリについては何も知らなかったため,正しいコードをベースに,逆に概念に入ることにした.
再帰クエリの概念を理解するために、MySQLtutorialの文書を参照してください.
正解から,HOURが0,1に等しい場合,値がなくても表に存在する.従って、LEFTOUTER JOINを用いて提供される表
私が初めて使ったコードは以下の通りです.
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
である.Reference
この問題について(SQL再帰クエリ:RECURSIVE), 我々は、より多くの情報をここで見つけました https://velog.io/@7ryean/SQLテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol