Ошибка 1172 - Результат состоит из более чем одной строки в MySQL - PullRequest
0 голосов
/ 27 апреля 2020

Я пытаюсь создать функцию, которая проверяет, существует ли ключ для книги в таблице книг, и если это так, она определяет количество этой книги в таблице инвентаря и количество, которое было продано за Таблица купленных предметов. Когда я пытаюсь запустить мой текущий код, он говорит: «Результат состоит из более чем одной строки» каждый раз, когда я запускаю его, независимо от значения. Я не знаю, как еще его настроить.

DELIMITER //

CREATE FUNCTION quantity_on_stock(
    book_key INT
)
RETURNS INT
READS SQL DATA
BEGIN
    DECLARE num_books_recieved INT;
    DECLARE num_books_sold INT;
    DECLARE book_key_var INT;
    DECLARE book_inventory_key_var INT;

    SELECT book_key
    INTO book_key_var
    FROM books
    WHERE book_key = books.book_key;

    IF book_key = book_key_var THEN
        SELECT quantity INTO num_books_recieved FROM book_inventory bi WHERE book_key = bi.book_key;
        SELECT book_inventory_key INTO book_inventory_key_var FROM book_inventory bi WHERE book_key = bi.book_key;
        SELECT quantity INTO num_books_sold FROM purchase_items pi WHERE book_inventory_key_var = pi.book_inventory_key;
    END IF;

    RETURN (num_books_recieved - num_books_sold);
END//

DELIMITER ;

Book_key - это FK в таблице инвентаризации книг. Book_inventory_key - это FK в таблице purchase_items.

Ответы [ 2 ]

0 голосов
/ 27 апреля 2020

Этот лог c:

  SELECT quantity INTO num_books_recieved 
  FROM book_inventory bi
  WHERE book_key = bi.book_key;

Не делает то, что вы думаете. Первый book_key относится также к столбцам - столбцы сопоставляются перед переменными.

Итак, это действительно так:

  SELECT quantity INTO num_books_recieved 
  FROM book_inventory bi
  WHERE bi.book_key = bi.book_key;

Я бы предложил переименовать переменные во что-то, что не не конфликтует с именами столбцов.

0 голосов
/ 27 апреля 2020

Добавить LIMIT 1 к вашему запросу:

SELECT book_key
INTO book_key_var
FROM books
WHERE book_key = books.book_key
LIMIT 1;
...