Назначение правильного значения для customerIDs в функции sql - PullRequest
0 голосов
/ 21 января 2019

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

CREATE FUNCTION `test5`(ID int(11) ) RETURNS int(11)
BEGIN DECLARE result int;
    if (select ID from customer where ID not in (select CustomerID from reservation) limit 1) then set result = -1;
    else if (select ID from customer where ID in (select CustomerID from reservation) limit 1) then set result = (select sum(c.NoReservedSeats*f.FlightDurationInMinutes) as Bonus 
    from reservation c, flightexecution f where c.FlightNo=f.FlightNo 
    and f.DepartureDateAndTimeUTC = c.DepartureDateAndTimeUTC 
    and c.CustomerID = c.CustomerID group by c.CustomerID limit 1) ;
    end if;
    end if;
RETURN result;
END

Итак, это бонусные значения для идентификаторов клиентов в таблице бронирования

+-------+
| Bonus |
+-------+
|   360 |
|   180 |
|  2280 |
|  2040 |
|   180 |
|  7180 |
+-------+

Итак, первый оператор if работает, но второй не работает, я должен установить предел 1, потому что в противном случае получим «Ошибка 1242 Подзапрос возвращает более одной строки». Но с этим ограничением 1 выражение я получаю за каждого клиента 360 бонусов, что является моей проблемой.

1 Ответ

0 голосов
/ 21 января 2019

Вы не проверяете, есть ли параметр ID в reservations.Оно должно быть:

IF EXISTS (SELECT * FROM reservations WHERE CustomerID = ID) 
THEN SET result = (SELECT ...)
ELSE SET result = -1
END IF;
RETURN result;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...