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