복붙노트

[SQL] 제 3 표에 자신의 FKS 2 개 테이블을 조인하는 데 필요

SQL

제 3 표에 자신의 FKS 2 개 테이블을 조인하는 데 필요

그래서 기본적으로 나는`m 아래 나에게 묻는 튜토리얼 질문을 다음. 나도 확인 방법 다른 자신 (즉, 자신의 FKS 모두가) 제 3 테이블에있는 FK를 포함하지 않는 두 테이블을 가입하고 있지 않다. 나는 도움 / 설명을 얻을 수 있을까요?

내 대답

SELECT Forest.Fo_name, Species.Sp_name, Species.Sp_woodtype
FROM Forest
INNER JOIN Species
ON Tree.Tr_species=Tree.Tr_forest
WHERE Fo_loc='ARTIC'
ORDER BY Fo_name, Sp_name

ARTIC "숲로써 코딩 영역에 위치한" "숲 명 종 이름과 종 나무 형 내부에서 발견. 임의의 중복을 제거 산림 이름 종 이름 출력 순서"

종 테이블

+--------------+------------------+------+--------------------------------+
| Field        | Type             |  Key | Glossary                       |
+--------------+------------------+------+--------------------------------+
| sp_name      | C(10)            |  PK  | Species Name                   |
| sp_woodtype  | C(10)            |      | Wood Yielded by tree           |
| sp_maxht     |  I               |      | Max. Height                    |
+--------------+------------------+------+--------------------------------+

숲 테이블

+--------------+------------------+------+--------------------------------+
| Field        | Type             |  Key | Glossary                       |
+--------------+------------------+------+--------------------------------+
| Fo_name      | C(10)            |  PK  | Forest Name                    |
| Fo_size      |   I              |      | Forest Area                    |
| Fo_loc       | C(10)            |      | Geographical Area              |
| Fo_comp      | C(10)            |      | Forest Owner                   |
+--------------+------------------+------+--------------------------------+

나무 테이블

+--------------+------------------+------+---------------------------------------------+
| Field        | Type             |  Key | Glossary                                    |
+--------------+------------------+------+---------------------------------------------+
| Tr_species   | C(10)            |  FK  | (FK  of species.sp_name                     |
| Tr_forest    | C(10)            |  FK  | (FK of forest.fo_name                       |
| Tr_numb      |   I              |  PK  | Sequence number                             |
| Tr_planted   | Date             |      | Date of planting                            | 
| Tr_loc       | C(10)            |      | Forest quadrant                             |
| Tr_parent    |   I              |  FK  | (FK of tree.numb) procreating tree reference|
+--------------+------------------+------+---------------------------------------------+

C (10) & I는 각각 문자 (10) 및 정수에 대한 서

해결법

  1. ==============================

    1.나무 테이블은 숲 테이블과 종 테이블 사이의 연결입니다. 두 단계로 생각 :

    나무 테이블은 숲 테이블과 종 테이블 사이의 연결입니다. 두 단계로 생각 :

    1) 숲 테이블에서 시작, 트리 테이블 (Forest.Fo_name에서 Tree.Tr_forest에)에 가입

    2) 이제 나무가 알려진 것으로, Tree.species에서 Species.sp_name에 (종 테이블에 가입)

    이 같은 최종 쿼리를 작성할 것입니다 :

    SELECT Forest.Fo_name, Species.Sp_name, Species.Sp_woodtype
    FROM Forest
    JOIN Tree ON Forest.Fo_name=Tree.Tr_forest
    JOIN Species ON Tree.species=Species.sp_name
    WHERE Fo_loc='ARTIC'
    ORDER BY Fo_name, Sp_name
    
  2. ==============================

    2.외래 키는 테이블을 조인 필요하지 않습니다!

    외래 키는 테이블을 조인 필요하지 않습니다!

    그들이 단지 그들과 합류하는 사이에 FK가 없을 때 테이블을 조인하는 방법에 대한 대답 그래서.

    진짜 문제는 우리가 어떻게 어떤 테이블을 조인 (또는 다른 방법으로 결합)하도록 선택인가?

    문 및 테이블

    열 이름에 의해 파라미터 문 템플릿 - 모든 기본 테이블은 술어와 함께 제공됩니다. 문 - 테이블 값은 진정한 제안에 그 조건을 행합니다.

    // species [name] yields [woodtype] and has max height [maxht]
    Species(name,woodtype,maxht)
    // forest [name] has area [size] in area [loc] and owner [comp]
    Forest(name,size,loc,comp)
    // tree group [numb] is of species [species] in forest [forest] and was planted in [planted] in quadrant [loc] on date [date] with parent tree group [parent]
    Tree(species,forest,numb,planted,loc,parent)
    

    쿼리는 술어가 있습니다. 이 값은 또한 술어가 사실 확인 행이다. 그 술어의 FROM, WHERE 및 기타 조항에 따라 구축된다. 테이블 값의 기본 테이블 좋아하지만 별칭 접두어 열이있는 테이블의 별명. 그 술어가 사용하여 기본 테이블의 조건입니다 그래서 열 별칭을-접두사.

    Species s
    

    만족 행을 보유

    species [s.name] yields [s.woodtype] and has max height [s.maxht]
    

    CROSS & INNER은 넣어 술어 사이에 가입; UNION 풋 또는 그들 사이; 삽입 AND NOT 및 ON을 EXCEPT 및 WHERE 및 조건에; SELECT는, 이름을 변경 추가 및 열 삭제합니다. (기타 다른 사업자.) 그래서

    Species s CROSS JOIN Forest f
    

    행 어디 보유

        species [s.name] yields [s.woodtype] and has max height [s.maxht]
    AND forest [f.name] has area [f.size] in area [f.loc] and owner [f.comp]
    

    (아니 제약이 무엇인지 중요!) 당신은 그 값이 만족 행이 될 수 있기 때문에 다음 방금 통해 ... WHERE f.name = s.woodtype 조건을 추가 할 자신의 나무 종류의 이름을 딴 숲을 가진 위의 행만을 원한다면 ... AND f.name = s.woodtype.

    즉 반환 된 행이 만족하는 것을 큰 비공식적 인 조건이다. 우리는 우리가 주어진 플러스 AND, OR, AND NOT (등)되어 있는지에만 술어를 사용하여 재 작성하려고하면 우리는 세 가지 주어진 조건을 AND 연산하여 작업을 수행 할 수 있습니다 (따라서, 기본 테이블 이름의 가입) 추가 및 Forest.loc = 'ARCTIC'(따라서, ON 또는 조건).

    FKS (등)와 쿼리 (안)

    PK와 및 FKS은 무결성 제약 조건의 특별한 경우이다. 술어 감안할 때 상황이 발생할 수있는, 일부 데이터베이스 값이 발생할 수 있습니다. 즉 무결성 제약 조건은 무엇을 설명합니다. 그들은 DBMS가 발생하지 않아야 데이터베이스 값을 유지 할 수 있습니다. (또한, 최적화 쿼리 실행.)의 이름은 종의 고유하기 때문에 우리가 중요한 선언합니다. 숲 이름과 나무 마비에 대한 동감. 나무의 종은 종의 이름이고 이름은 종의 핵심이기 때문에 우리는 FK Tree.species-> Species.name을 선언합니다. 숲과 부모에 대한 동감. 가능과는 아무 조인 없습니다. (그들은 의미하지만 너무 쿼리 결과가 만족 특정 제약 조건, 즉.)

    이 제약 조건이 무엇인지 질의에 문제가되지 않습니다. 비즈니스 규칙 또는 나무 또는 종 조건 (들)을 더 FK Tree.species-> Species.name 없을 것이다 달랐다 때문에 어떤 종 이름 값으로 표시하지 않은 나무 종 값이 있다면. 그러나 각 쿼리는 기본 테이블 조건의 표현으로 그 조건을 만족하는 행을 반환 계속 것입니다. (가능한 비즈니스 상황 또는 술어 (들)이 상이 할 것이기 때문에 출력 행이 다를 수 있으므로, 입력 행이 다를 수있다.)

    어떤 쿼리 SQL을 결정한다

    우리는 테이블 조인 (또는 다른 방법으로 결합)하는 것을 선택하는 방법에 대한 답은 술어 한 우리 쿼리 식을 제공하기 위해 적절하게 (등) 우리는 기본 테이블 이름을 배치, UNION은 제외하고 가입하고 WHERE이다 그래서 우리의 행이 만족합니다. 이것은 일반적으로 느낌에 의해 수행 될 비공식적 인 무언가로 진행됩니다하지만 지금은 자연 언어에 SQL을 묶어 것을 알고있다. 그리고 제약 관련이 있습니다.

    참고 : 위의 우리가 쿼리에서 어떤 중복 반환하지 가정합니다. 관계형 모델의 테이블에는 중복이없는 이유는 테이블 연산자와 논리 접속사 사이의 위의 대응이 유지되도록한다. 그러나 SQL 테이블은 중복이있을 수 있습니다. (많은 방법으로) 관계형 모델에서 SQL의 다릅니다은, 쿼리는 이하 (문자 그대로)의 논리가 될 경우.

    다시는 외래 키를 다음 조인 선택 테이블을 다시 사람이 읽을 수있는 설명에서 SQL 쿼리를 구성하는 엄지 손가락의 규칙이 있나요?

  3. ==============================

    3.여러 조인 할 수 있습니다. 메인 테이블 숲에 나무 테이블을 연결 한 후 종 테이블을 사용하고 있습니다 :

    여러 조인 할 수 있습니다. 메인 테이블 숲에 나무 테이블을 연결 한 후 종 테이블을 사용하고 있습니다 :

    SELECT 
    Forest.Fo_name, 
    Species.Sp_name, 
    Species.Sp_woodtype
    
    FROM 
    Forest
    INNER JOIN Tree ON Tree.Tr_forest=Forest.Fo_name
    INNER JOIN Species ON Tree.Tr_species = Species.sp_name
    
    WHERE 
    Fo_loc='ARTIC'
    
    ORDER BY Fo_name, Sp_name
    
  4. ==============================

    4.온 조건은 다른 테이블에서 열을 비교해야한다.

    온 조건은 다른 테이블에서 열을 비교해야한다.

    그럼 그냥 단계별로 각 테이블 단계를 가입 할 수 있습니다.

    SELECT DISTINCT Fo_name, Sp_name, Sp_woodtype
    FROM Forest AS f
    INNER JOIN Tree AS t ON t.Tr_forest = f.Fo_name
    INNER JOIN Species AS s ON t.Tr_speecies = s.Sp_name
    WHERE f.Fo_loc = 'ARCTIC'
    ORDER BY Fo_name, Sp_name
    
  5. ==============================

    5.

    SELECT Forest.Fo_name, Species.Sp_name, Species.Sp_woodtype
        FROM Forest
            INNER JOIN Tree 
                INNER JOIN Species ON Species.sp_name = Tree.Tr_species
            ON Forest.Fo_name=Tree.Tr_forest
    WHERE Fo_loc='ARTIC'
    ORDER BY Fo_name, Sp_name
    
  6. ==============================

    6.는 SQL 99 방법을 시도

    는 SQL 99 방법을 시도

          SELECT DISTINCT F.Fo_name, S.Sp_name, Sp_woodtype
          FROM Forest F, Species S, Tree T
          WHERE F.Fo_name = T.Tr_Forest 
          AND S.Sp_name = Tr_species
          AND f.Fo_loc = 'ARCTIC';
    

    A ~ F S는 SQL이 짧고 깔끔한 만드는 데 사용 별명이다.

    중복 제거됩니다 DISTINCT.

  7. from https://stackoverflow.com/questions/23839392/required-to-join-2-tables-with-their-fks-in-a-3rd-table by cc-by-sa and MIT license