2014-11-08 1 views
1

이 스키마가 있다고 가정 해 봅시다.내부 조인의 연관성과 commutativity SQL

Boats 
_____ 
bid 
bname 

Reserves 
________ 
sid 
bid 
date 

Sailors 
_______ 
sid 
sname 

내측 조인은 연관성과 교환 성이 있어야한다는 것을 알고 있습니다. 그러나 나는 왜 그런지 이해할 수 없습니다.

SELECT sname, bname 
FROM (Sailors NATURAL INNER JOIN Reserves) NATURAL INNER JOIN Boats 

는 선원과 이름의 이름을 반환해야하지만,

SELECT sname, bname 
FROM (Sailors NATURAL INNER JOIN Boats) NATURAL INNER JOIN Reserves 

나는 선원와 보트 공통 필드가 없기 때문에이 null 반환해야 함을 생각하고 :

쿼리를 감안할 때 그들이 예약 한 보트들.

내측 조인이 교환 가능하고 연관성이 있어야하는 이유를 말해주십시오.

감사합니다.

답변

0
SELECT sname, bname 
FROM (Sailors NATURAL INNER JOIN Boats) NATURAL INNER JOIN Reserves 

나는, 선원 및 보트 가 공통 필드가 없기 때문에이 null을 반환해야한다고 생각하고있다. . .

PostgreSQL에서 공통 열이없는 두 테이블 사이에 natural join은 교차 결합과 같이 동작합니다. 그럼

create table boats (
    bid integer primary key, 
    bname varchar(15) 
); 

create table sailors (
    sid integer primary key, 
    sname varchar(15) 
); 

insert into boats values (1, 'One'), (2, 'Two'), (3, 'Three'); 
insert into sailors values (1, 'One'), (2, 'Two'), (3, 'Three'); 

SELECT sname, bname 
FROM (Sailors NATURAL INNER JOIN Boats); 
 
sname bname 
-- 
One  One 
One  Two 
One  Three 
Two  One 
Two  Two 
Two  Three 
Three One 
Three Two 
Three Three 
+0

하는 순서의 변화 또는 그룹화 내부는 쿼리의 속도에 영향을 미칠 것 조인에서? – user3903214

+1

나도 몰라,하지만 속도가 다를 거라고 생각하지. 나는 쿼리 플래너가 두 쿼리 모두에 대해 동일한 실행 계획을 선택하기를 기대합니다. 임의의 (ish) 데이터를 테이블에 채우고 [EXPLAIN] (http://www.postgresql.org/docs/current/static/sql-explain.html)을 사용하여 테스트 할 수 있습니다. –

+1

@ user3903214하지만 다른 그룹의 조합에 해당하는 그룹을 선택하고 그룹화하는 경우 결합의 조합 만이 아니라 해당 연산자의 조합이 어떻게 작동하는지가 중요합니다. – philipxy

관련 문제