programing

보조 테이블을 통한 재귀 선택 사용

oldcodes 2023. 8. 7. 23:06
반응형

보조 테이블을 통한 재귀 선택 사용

이 문제를 해결하기가 좀 힘듭니다.저는 데이터베이스나 복잡한 질문에 능숙하지 않습니다.

데이터베이스

최신 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의 주어진 이 있습니다.fieldsetsCTE에 있는 부모님께.

저는 퇴근하고 집에 왔는데, 이걸 내려놓을 수가 없었어요!

하지만 거기서 해결책이 나왔습니다.

재귀 쿼리의 작동 방식과 구문이 의미하는 바를 더 잘 이해하려면 재귀 쿼리에 대한 이 답변을 읽는 것이 좋습니다.아주 훌륭하게 설명되었습니다.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

반응형