2015-10-20 4 views
1

У меня есть три таблицы описывает так:NATURAL JOIN не работает должным образом

+----------+ +-----------------+ +----------+ 
| products | | products_stores | | stores | 
+----------+ +-----------------+ +----------+ 
| barecode | | #barecode  | | storeID | 
| name  |----| #storeID  |----| location | 
+----------+ | price   | +----------+ 
       +-----------------+  

создал их так:

CREATE TABLE IF NOT EXISTS `products` (
    `barecode` varchar(100) NOT NULL UNIQUE, 
    `name` varchar(25) NOT NULL, 
    PRIMARY KEY (`barecode`) 
); 
CREATE TABLE IF NOT EXISTS `stores` (
    `idStore` int(10) NOT NULL AUTO_INCREMENT, 
    `name` varchar(25) NOT NULL, 
    `location` varchar(100) NOT NULL, 
    PRIMARY KEY (`idStore`) 
); 
CREATE TABLE IF NOT EXISTS `products_stores` (
    `idStore` int(10) NOT NULL, 
    `barecode` VARCHAR(100) NOT NULL, 
    `price` double NOT NULL, 
    FOREIGN KEY (`barecode`) REFERENCES `products`(`barecode`), 
    FOREIGN KEY (`idStore`) REFERENCES `stores`(`idStore`) 
); 

Я хотел, чтобы все продукт и его цену с правом магазина поэтому я попробовал NATURAL JOIN, но ничего не ответил (код ниже 1-). Поэтому я попробовал только один NATURAL JOIN только для проверки, и он работает (код ниже 2- и 3-).

1- SELECT * FROM products NATURAL JOIN products_stores NATURAL JOIN stores; 
2- SELECT * FROM products JOIN products_stores NATURAL JOIN stores; 
3- SELECT * FROM products NATURAL JOIN products_stores JOIN stores; 

Я не понимаю, почему «двойной» NATURAL JOIN не работает. Кто-нибудь может мне помочь в этом? Спасибо.

+0

Когда вы говорите 'не работает' ... что это значит? Вы получаете какую-либо ошибку? –

+0

Являются ли имена столбцов в таблице 'products_stores' действительно' # barecode', или это символ фунта только для акцента? –

+0

Нет, он ничего не возвращает. Пустая таблица, как описано при создании таблиц. @Tim: это действительно внешние ключи, и он работает только с одним естественным соединением, а не с двумя ... Не могу понять, почему – TDK

ответ

1

Это зависит от ваших данных, вот что documentation должен сказать об этом

Оценка многоходовой естественные соединения отличается очень важным образом, что влияет на результат естественного или USING присоединяется и что может требовать перезаписи запроса. Предположим, что у вас есть три таблицы t1 (a, b), t2 (c, b) и t3 (a, c), каждая из которых имеет одну строку: t1 (1,2), t2 (10,2) и t3 (7,10). Предположим также, что у вас есть этот ПРИРОДНЫЙ СОЕДИНЕНИЕ на трех таблицах :

SELECT ... FROM t1 NATURAL JOIN t2 NATURAL JOIN t3; Ранее левый операнд считался t2, тогда как должен быть вложенным соединением (t1 NATURAL JOIN t2). В результате столбцы для t3 проверяются для общих столбцов только в t2, и если t3 имеет общие столбцы с t1, эти столбцы не используются в качестве эквивальных столбцов . Таким образом, ранее предыдущий запрос был преобразован в после equi-join:

SELECT ... FROM t1, t2, t3 WHERE t1.b = t2.b И t2.c = t3.c; В этом объединении отсутствует еще один предикат equi-join (t1.a = t3.a). Как результат , он создает одну строку, а не пустой результат. правильный эквивалент запроса заключается в следующем:

SELECT ... FROM t1, t2, t3 WHERE T1.b = t2.b И t2.c = t3.c И T1.a = t3.a;

Короче говоря, второй JOIN проверяет только предыдущую колонку таблицы, а не результат WHOLE первого JOIN.

Одна из причин, почему NATURAL JOINs не рекомендуется, мало контроля и мало что можно получить.

+1

Хорошо, я понимаю вещь.Я сделаю это с регулярным присоединением, я думал, что естественное соединение было действительно выигрышным! – TDK

Смежные вопросы