Внутреннее соединение «не уникальная таблица»

#mysql #sql

#mysql #sql

Вопрос:

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

 Not unique table/alias: 'car'
  

Что я делаю не так?

Моя процедура

 DELIMITER //   
CREATE PROCEDURE orderCreate(IN _LicenseNumber varchar(30), _Phonenumber varchar(20))
BEGIN    
INSERT INTO `order` (carID, clientID) 
Select car.id, client.id 
FROM car, client, owns   
INNER JOIN car 
ON car.id = owns.carID

INNER JOIN owns 
ON owns.clientID = client.id;

WHERE  car.licensenumber = _LicenseNumber 
AND client.phonenumber = _Phonenumber 
SELECT LAST_INSERT_ID(); 

END // 
DELIMITER ;  
  

Комментарии:

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

Ответ №1:

Я думаю, у вас много таблиц: попробуйте:

 INSERT INTO `order` (carID, clientID) 
Select car.id, client.id 
FROM car    
INNER JOIN owns 
ON owns.clientID = client.id;
WHERE  car.licensenumber = _LicenseNumber 
AND client.phonenumber = _Phonenumber 
SELECT LAST_INSERT_ID(); 
  

Комментарии:

1. Вам не хватает операции объединения.

2. хорошо, будет ли в этом случае иметь смысл объединяться или я должен просто придерживаться предложений WHERE?

3. @user3660361 это зависит от вас. Я предпочитаю join .

Ответ №2:

Вы выполняете как INNER JOIN и декартово произведение (что одинаково в MySQL 1):

 FROM car, client, owns   
INNER JOIN car 
ON car.id = owns.carID

INNER JOIN owns 
ON owns.clientID = client.id;
  

Просто удалите car и owns из вашего FROM заявления.

Если вы хотите оба, вам нужно добавить псевдоним в car и owns :

 FROM car AS car1, clients, owns AS owns1
  

Ссылки

  1. http://dev.mysql.com/doc/refman/4.1/en/join.html

ВНУТРЕННЕЕ СОЕДИНЕНИЕ и (запятая) семантически эквивалентны при отсутствии условия соединения: оба создают декартово произведение между указанными таблицами