SQL : 다른 테이블에서 일치하는 조상과 조인 (내부 조인)

스티븐

그래서 저는이 SQL 쿼리를 알아 내려는 노력에 완전히 당황했습니다.

나무와 같은 구조로 존재하는 제품 범주 표가 있습니다. 단순화하기 위해 A, B, C의 세 가지 최상위 범주가 있다고 가정 해 보겠습니다. 그 위에 루트 인 범주가 하나 더 있습니다 ( 'All'). 이 카테고리에는 제품을 지정할 수 없습니다. 제품에 할당 할 수없는 카테고리를 구분하기 위해 '콘크리트'가 아닌 '추상'유형이 있습니다.

각 카테고리는 하위 카테고리의 수와 깊이를 가질 수 있습니다. 나는 현재 직계 부모 (인접 목록)에 대한 부모 ID와 함께 이것을 저장하고 있습니다.

Categories

Category   Parent    Type
All        None      Abstract
A          All       Concrete
B          All       Concrete
C          All       Concrete
D          A         Concrete
E          D         Concrete
F          B         Concrete
G          F         Concrete
H          C         Concrete
I          C         Concrete

카테고리 필드가있는 다른 제품 테이블이 있습니다. 이 표에 나타나는 유일한 범주는 최상위 범주입니다. 즉. A, B 또는 C 중 하나입니다.

Products

Part Number       Category
XXXX-XXXX         A
XXXX-YYYY         A
XXXX-ZZZZ         B
YYYY-XXXX         C

두 테이블을 조인하는 쿼리를 만들어 Category가 자식 범주로 바뀌는 행을 만들고 싶습니다. 즉. 의사 코드 관점에서 기본적으로 카테고리에 조인 = 제공된 카테고리는 카테고리의 하위 항목이거나 동일합니다.

그래서 다음과 같습니다.

select * from products
inner join categories
on products.category = descendent of category

결과는 다음과 같습니다.

Part Number       Category
XXXX-XXXX         E (E's top level concrete parent is A)
XXXX-YYYY         E (E's top level concrete parent is A)
YYYY-XXXX         H (H's top level concrete parent is C)
YYYY-XXXX         I (I's top level concrete parent is C)

나는 최상위 수준까지 모든 구체적인 유형을 검색하는 다음과 같습니다.

with recursive
concrete_parents as (
  select category, parent, type
  from categories
  where category in ('E', 'H', 'I')
  UNION ALL
    select t2.category, t2.parent, t2.type
    from categories as t2
    inner join concrete_parents t1
    on t1.parent = t2.category
    where t2.type = 'Concrete'
)

select distinct * from concrete_parents
order by parent;

이것을 메인 테이블의 내부 조인과 결합하는 방법을 알아낼 수 없습니까?

내가 고려중인 또 다른 대안은 Postgres ltree를 사용하는 것이지만 익숙하지 않습니다.

이견있는 사람?

Erwin Brandstetter

... 최상위 수준의 구체적인 카테고리를 동적으로 캡처하는 것이 좋습니다.

당신이 말한 이후로 그것은 가능해 보입니다.

이 표 ( Products)에 나타나는 유일한 범주 는 최상위 범주입니다 . A, B 또는 C.

따라서 이러한 최상위 범주는 최종에서 JOIN자동으로 필터링 됩니다. 그리고 그것들 (그리고 그것들 만) parent = 'All'당신의 샘플 데이터에 따라 있기 때문에 , 우리는 한 수준의 재귀를 줄이고 조금 더 빠르게 만들 수 있습니다.

WITH RECURSIVE parent_cat AS (
   SELECT category AS original, category, parent -- no need for type
   FROM   categories      c
   WHERE  category in ('A', 'D', 'H', 'I')

   UNION ALL
   SELECT pc.original, c.category, c.parent
   FROM   parent_cat pc
   JOIN   categories c ON c.category = pc.parent
   WHERE  pc.parent <> 'All'  -- stop at top level, save 1 recursion
   )
SELECT p.part_number, pc.category, pc.original 
FROM   parent_cat pc
JOIN   products   p USING (category)
WHERE  pc.parent = 'All'      -- redundant, but a bit faster
ORDER  BY pc.original;

또한 type = 'Concrete'다른 유형은 pc.parent = 'All'이미 조인에 의해 필터링되기 때문에로 필터링 할 필요가 없습니다 .

db <> 여기에 바이올린

BTW, 성능이 중요하고 범주가 너무 많이 변경되지 않는 경우 쿼리 MATERIALIZED VIEW에서 rCTE parent_cat교체하는 것을 고려하고 적절한 체제를 구현하여 최신 상태로 유지하십시오.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

조건이 다른 동일한 테이블에서 mysql 쿼리 내부 조인

분류에서Dev

SQL 내부 조인 두 테이블을 오른쪽에 2 개 일치

분류에서Dev

다른 테이블에 대한 SQL 조건부 조인

분류에서Dev

SQL Server 내부 조인은 하나의 테이블에서만 결과를 가져옵니다.

분류에서Dev

SQL에서 다른 조건을 여러 내부 조인과 결합하는 방법은 무엇입니까?

분류에서Dev

다중 조인 / 내부 조인 SQL에 대한 필터 조건

분류에서Dev

SQL 요청, 동일한 테이블에 대한 내부 조인?

분류에서Dev

테이블 데이터의 일부에서 조건이 다른 두 테이블에 대한 왼쪽 조인

분류에서Dev

Access-SQL : 다른 테이블의 여러 복사본이있는 테이블 내부 조인

분류에서Dev

결과 열이 다른 SQL Server 조건부 조인

분류에서Dev

SQL 다중 내부 조인

분류에서Dev

다중 테이블에서 SQL 조건부 조인을 수행하는 방법은 무엇입니까?

분류에서Dev

MySQL은 동일한 테이블에서 자식 + 부모를 조인 한 다음 둘 다 다른 테이블과 조인합니다.

분류에서Dev

내부 조인없이 두 테이블에서 SQL 선택

분류에서Dev

동일한 쿼리에서 두 테이블을 조인하는 MySQL. 내부 조인 또는 왼쪽 조인?

분류에서Dev

배열에서 다 대다 관계 (내부 조인 테이블)를 쿼리하는 MySQL 조건부

분류에서Dev

내부 조인이지만 다른 테이블에서 외래 키 비트를 이해하지 못합니다.

분류에서Dev

뷰에있는 네 테이블의 SQL Server 조건부 조인

분류에서Dev

내부 조인 테이블에서 서로 다른 레코드를 선택하는 방법

분류에서Dev

내부 조인의 결과를 테이블 SQL에 병합

분류에서Dev

SQL 조인 일부 테이블

분류에서Dev

내부 조인을 사용하여 다른 테이블의 다른 열 표시

분류에서Dev

다른 테이블에서 여러 필드를 조인하기위한 SQL 문?

분류에서Dev

MS SQL에서 다양한 다른 테이블과 조인하는 선택 쿼리 성능 최적화

분류에서Dev

내부 조인을 사용하여 다른 테이블에서 레코드를 가져 오는 방법

분류에서Dev

단일 테이블에 대한 내부 조인이있는 SQL 수

분류에서Dev

내부 조인이있는 SQL max ()

분류에서Dev

하나의 테이블에서 T-SQL 다중 조인

분류에서Dev

Sqlite에서 다른 테이블과 테이블 내부 조인을 삭제하는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    조건이 다른 동일한 테이블에서 mysql 쿼리 내부 조인

  2. 2

    SQL 내부 조인 두 테이블을 오른쪽에 2 개 일치

  3. 3

    다른 테이블에 대한 SQL 조건부 조인

  4. 4

    SQL Server 내부 조인은 하나의 테이블에서만 결과를 가져옵니다.

  5. 5

    SQL에서 다른 조건을 여러 내부 조인과 결합하는 방법은 무엇입니까?

  6. 6

    다중 조인 / 내부 조인 SQL에 대한 필터 조건

  7. 7

    SQL 요청, 동일한 테이블에 대한 내부 조인?

  8. 8

    테이블 데이터의 일부에서 조건이 다른 두 테이블에 대한 왼쪽 조인

  9. 9

    Access-SQL : 다른 테이블의 여러 복사본이있는 테이블 내부 조인

  10. 10

    결과 열이 다른 SQL Server 조건부 조인

  11. 11

    SQL 다중 내부 조인

  12. 12

    다중 테이블에서 SQL 조건부 조인을 수행하는 방법은 무엇입니까?

  13. 13

    MySQL은 동일한 테이블에서 자식 + 부모를 조인 한 다음 둘 다 다른 테이블과 조인합니다.

  14. 14

    내부 조인없이 두 테이블에서 SQL 선택

  15. 15

    동일한 쿼리에서 두 테이블을 조인하는 MySQL. 내부 조인 또는 왼쪽 조인?

  16. 16

    배열에서 다 대다 관계 (내부 조인 테이블)를 쿼리하는 MySQL 조건부

  17. 17

    내부 조인이지만 다른 테이블에서 외래 키 비트를 이해하지 못합니다.

  18. 18

    뷰에있는 네 테이블의 SQL Server 조건부 조인

  19. 19

    내부 조인 테이블에서 서로 다른 레코드를 선택하는 방법

  20. 20

    내부 조인의 결과를 테이블 SQL에 병합

  21. 21

    SQL 조인 일부 테이블

  22. 22

    내부 조인을 사용하여 다른 테이블의 다른 열 표시

  23. 23

    다른 테이블에서 여러 필드를 조인하기위한 SQL 문?

  24. 24

    MS SQL에서 다양한 다른 테이블과 조인하는 선택 쿼리 성능 최적화

  25. 25

    내부 조인을 사용하여 다른 테이블에서 레코드를 가져 오는 방법

  26. 26

    단일 테이블에 대한 내부 조인이있는 SQL 수

  27. 27

    내부 조인이있는 SQL max ()

  28. 28

    하나의 테이블에서 T-SQL 다중 조인

  29. 29

    Sqlite에서 다른 테이블과 테이블 내부 조인을 삭제하는 방법은 무엇입니까?

뜨겁다태그

보관