2014-11-08 4 views
1

Скажем, у меня есть эта схема.Ассоциативность и коммутативность внутренних объединений sql

Boats 
_____ 
bid 
bname 

Reserves 
________ 
sid 
bid 
date 

Sailors 
_______ 
sid 
sname 

Я знаю, что внутренние соединения должны быть как ассоциативной и коммутативной, но я не могу понять, почему.

Учитывая запрос:

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

Я имею в виду, что это должно вернуться null так Моряки и лодки не имеют общих полей, в то время как:

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

должен возвращать имена моряков и имена которые они зарезервировали.

Скажите, пожалуйста, почему внутренние соединения должны быть как коммутативными, так и ассоциативными.

Спасибо!

ответ

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

Я имею в виду, что это должно возвращать нуль, так как матросы и лодки не имеют общих полей. , ,

В PostgreSQL a 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