[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) 숲 테이블에서 시작, 트리 테이블 (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.외래 키는 테이블을 조인 필요하지 않습니다!
외래 키는 테이블을 조인 필요하지 않습니다!
그들이 단지 그들과 합류하는 사이에 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.여러 조인 할 수 있습니다. 메인 테이블 숲에 나무 테이블을 연결 한 후 종 테이블을 사용하고 있습니다 :
여러 조인 할 수 있습니다. 메인 테이블 숲에 나무 테이블을 연결 한 후 종 테이블을 사용하고 있습니다 :
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.온 조건은 다른 테이블에서 열을 비교해야한다.
온 조건은 다른 테이블에서 열을 비교해야한다.
그럼 그냥 단계별로 각 테이블 단계를 가입 할 수 있습니다.
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.
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.는 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.
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
'SQL' 카테고리의 다른 글
[SQL] 어떻게해야합니까 문자열로 출력 원시 SQL 쿼리에 쿼리 작성기를 가져옵니다? (0) | 2020.03.23 |
---|---|
[SQL] 특정 필드에 중복을 찾기 위해 문을 선택 (0) | 2020.03.23 |
[SQL] 왜 SQL Server는 밀리 초를 잃고있다? (0) | 2020.03.22 |
[SQL] dplyr left_join 이하,보다 의해 조건보다 (0) | 2020.03.22 |
[SQL] 오라클 SQL에서 작은 따옴표를 처리하는 방법 (0) | 2020.03.22 |