보조 테이블을 통한 재귀 선택 사용
이 문제를 해결하기가 좀 힘듭니다.저는 데이터베이스나 복잡한 질문에 능숙하지 않습니다.
데이터베이스
최신 MariaDB 릴리즈를 사용하고 있습니다.
계층적 데이터 구조를 나타내는 데이터베이스 테이블 구성이 있습니다.
|----------------------|
| fieldsets |
|----+-----------------|
| id | parent_field_id |
|----+-----------------|
| 1 | NULL |
| 2 | 1 |
|----------------------|
|-------------------------|
| fields |
|----+--------------------|
| id | parent_fieldset_id |
|----+--------------------|
| 1 | 1 |
| 2 | 1 |
|-------------------------|
문제
재귀적인 질문을 정리하려고 합니다.지정된 계층의 모든 필드 집합을 선택해야 합니다.예를 들어, 위의 제거된 예제에서 다음 필드 집합을 선택합니다.id = 1
그리고 모든 하위 필드 집합.
계층의 특정 수준에서 다음 순위의 ID는 보조 테이블의 열을 통해서만 가져옵니다.
테이블fieldsets
모든 자식을 직접 가져올 수 있는 열이 없습니다.fieldsets
나는 모든 것을 얻어야 합니다.fields
그것은 주어진 아이입니다.fieldset
그리고 나서 아무거나.fieldsets
그것은 그 아이입니다.field
.
문제에 대한 더 나은 설명
보고된 오류 "table all_fieldsets에 대해 재귀적 정의에 적용된 제한이 위반되었습니다." 때문에 이 쿼리가 작동하지 않습니다.
하지만, 그것은 모든 후손을 얻기 위해 내가 무엇을 해야 하는지를 정말로 보여줍니다.fieldsets
계층(즉, 필드 집합에는 상위 항목에 대한 열이 포함되지 않음)fieldset
이래로fieldset
을 가질 수 없습니다.fieldset
친부모로서대신에, afieldset
을 가지고 있습니다.parent_field_id
그것은 한 줄을 가리킵니다.fields
테이블, 그리고 그 행.fields
테이블에 이름이 지정된 열이 있습니다.parent_fieldset_id
그것은 뒤에 있는 줄을 가리킵니다.fieldsets
상위 항목으로 간주되는 테이블fieldset
아주fieldset
그저 간접적인 부모일 뿐입니다.
WITH RECURSIVE all_fieldsets AS (
SELECT fieldsets.* FROM fieldsets WHERE id = 125
UNION ALL
SELECT fieldsets.* FROM fieldsets
WHERE fieldsets.parent_field_id IN (
SELECT id FROM fields f
INNER JOIN all_fieldsets afs
WHERE f.parent_fieldset_id = afs.id
)
)
SELECT * FROM all_fieldsets
나의 시도
지금까지 제가 가지고 있는 질문(그것은 작동하지 않습니다):
WITH RECURSIVE all_fieldsets AS (
SELECT fieldsets.* FROM fieldsets WHERE id = 125
UNION
SELECT fieldsets.* FROM fieldsets WHERE fieldsets.id IN (SELECT fs.id FROM fieldsets fs LEFT JOIN fields f ON f.id = fs.parent_field_id WHERE f.parent_fieldset_id = fieldsets.id)
)
SELECT * FROM all_fieldsets
마이리서치
저는 또한 제 유스케이스에 맞는 예를 찾는 데 어려움을 겪고 있습니다.제 경우처럼 보조 테이블을 통해서가 아니라 하나의 테이블이 자신과의 관계만을 갖는 계층 구조에 대한 결과가 매우 많습니다.특정 개념에 대한 올바른 용어를 모를 때는 어렵고, 일반인의 설명이 너무 많은 접선 검색 결과를 산출하는 것처럼 보일 때는 어렵습니다.
나의 간청
저는 제가 어디서 잘못되고 있는지 지적해주고, 어쩌면 효과가 있을 질문의 개요를 제안해줄 수 있는 모든 사람들에게 매우 감사할 것입니다.
현재 코드의 주요 문제는 CTE(결합 후 나타나는 쿼리)의 재귀적 부분이 재귀적 CTE에서 선택되지 않는다는 것입니다.이 업데이트된 버전을 고려하십시오.
WITH RECURSIVE all_fieldsets AS (
SELECT * FROM fieldsets WHERE id = 125
UNION ALL
SELECT f1.*
FROM fieldsets f1
INNER JOIN all_fieldsets f2
ON f1.parent_field_id = f2.id
)
SELECT *
FROM all_fieldsets;
은 CTE의 주어진 이 있습니다.fieldsets
CTE에 있는 부모님께.
저는 퇴근하고 집에 왔는데, 이걸 내려놓을 수가 없었어요!
하지만 거기서 해결책이 나왔습니다.
재귀 쿼리의 작동 방식과 구문이 의미하는 바를 더 잘 이해하려면 재귀 쿼리에 대한 이 답변을 읽는 것이 좋습니다.아주 훌륭하게 설명되었습니다.WITH REASURIC 절을 사용하여 선택하는 방법
해결책
WITH RECURSIVE all_fieldsets AS (
SELECT * FROM fieldsets fs
WHERE id = 59
UNION ALL
SELECT fs.* FROM fieldsets fs
INNER JOIN all_fieldsets afs
INNER JOIN fields f
ON f.parent_fieldset_id = afs.id
AND fs.parent_field_id = f.id
)
SELECT * FROM all_fieldsets
에서 .fields
계층에서 다음 수준을 얻기 위해 테이블을 선택한 다음 재귀 쿼리에 빈 결과가 있을 때까지 재귀적으로 이 작업을 수행합니다.
언급URL : https://stackoverflow.com/questions/60437223/with-recursive-select-via-secondary-table
'programing' 카테고리의 다른 글
Numpy 배열에서 요소 이동 (0) | 2023.08.07 |
---|---|
파일이 PowerShell의 심볼 링크인지 확인합니다. (0) | 2023.08.07 |
Linux에서 도커를 중지하는 방법 (0) | 2023.08.07 |
이미지가 로드될 때 자바스크립트 콜백을 실행하려면 어떻게 해야 합니까? (0) | 2023.08.07 |
UIImageView 뒤에 그림자를 만드는 가장 좋은 방법은 무엇입니까? (0) | 2023.08.07 |