Результат состоял из более чем одной строки Ошибка 1172 MySQL - PullRequest
14 голосов
/ 11 февраля 2010

Здравствуйте, мне трудно с этой хранимой процедурой. я получаю ошибку: Результат состоял из более чем одного ряда.

вот моя хранимая процедура:

DELIMITER $$

DROP PROCEDURE IF EXISTS `dss`.`COSTRET` $$
CREATE DEFINER=`dwadmin`@`192.168.%.%` PROCEDURE `COSTRET`( TDATE DATE)
BEGIN
    DECLARE done INT DEFAULT 0;
    DECLARE ls_id VARCHAR(8);
    DECLARE ld_cost DECIMAL(10,4);
      DECLARE ld_retail DECIMAL(10,4);
    DECLARE cur1 CURSOR FOR SELECT DISTINCT `id` FROM `prod_performance` WHERE `psc_week` = TDATE;
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

  -- Get the Cost
  CREATE TEMPORARY TABLE IF NOT EXISTS `prod_itemcost`
    SELECT DISTINCTROW `itemcode` ID, `mlist` COST
    FROM (SELECT `itemcode`, `pceffdate`, `mlist`
        FROM `purchcost` a
        where `pceffdate` = (SELECT MAX(z.`pceffdate`) FROM `purchcost` z WHERE z.`itemcode` = a.`itemcode`
        AND z.`pceffdate` <= TDATE)) tb
    ORDER BY `itemcode`;

    OPEN cur1;
    REPEAT
      FETCH cur1 INTO ls_id;
      IF NOT done THEN
            SELECT DISTINCTROW `cost` INTO ld_cost FROM `prod_itemcost` WHERE id = ls_id;

        UPDATE LOW_PRIORITY `prod_performance` SET `current_cost` = ld_cost WHERE `psc_week` = TDATE and `id` = ls_id;
      END IF;
    UNTIL done END REPEAT;
    CLOSE cur1;

   -- Destroy Temporary Tables
   DROP TEMPORARY TABLES IF EXISTS `prod_itemcost`;
END $$

DELIMITER ;

Любые решения и рекомендации приветствуются!

Ответы [ 5 ]

7 голосов
/ 11 февраля 2010

Я бы сказал, что проблема здесь:

SELECT DISTINCTROW `cost` INTO ld_cost FROM `prod_itemcost` WHERE id = ls_id;

и вызвано этим возвращением более одной строки. Как вы решите это зависит от ваших требований. Означает ли, например, наличие нескольких строк, что база данных нуждается в некоторой очистке? Или вы должны принять первое значение «стоимость», или, возможно, сумму всех «стоимость» для id = ls_id?

Редактировать:

Ваше предложение INTO пытается записать несколько строк в одну переменную. Глядя на ваш SQL, я бы сказал, что основная проблема заключается в том, что ваш первоначальный запрос на получение только последней стоимости для каждого идентификатора затрудняется дубликатами pceffdate. Если это так, этот SQL:

SELECT DISTINCTROW `itemcode` ID, `mlist` COST
    FROM (SELECT `itemcode`, `pceffdate`, `mlist`
        FROM `purchcost` a
        where `pceffdate` = (SELECT MAX(z.`pceffdate`) FROM `purchcost` z WHERE z.`itemcode` = a.`itemcode`
        AND z.`pceffdate` <= TDATE)) tb

вернет больше строк, чем это:

SELECT DISTINCTROW `itemcode` ID
    FROM (SELECT `itemcode`, `pceffdate`, `mlist`
        FROM `purchcost` a
        where `pceffdate` = (SELECT MAX(z.`pceffdate`) FROM `purchcost` z WHERE z.`itemcode` = a.`itemcode`
        AND z.`pceffdate` <= TDATE)) tb
1 голос
/ 11 февраля 2010

Проблема в том, что

SELECT DISTINCTROW `itemcode` ID, `mlist` COST

может хранить несколько затрат для каждого идентификатора, поэтому

SELECT DISTINCTROW `cost` INTO ld_cost FROM `prod_itemcost` WHERE id = ls_id;

может вернуть несколько строк для каждого идентификатора.

Например, если стоимость покупки содержала следующее:

itemcode   mlist   pceffdate
1          10.99   10-apr-2009
1          11.99   10-apr-2009
1           9.99   09-apr-2009

Тогда временная таблица prod_itemcost будет содержать:

itemcode   mlist
1          10.99
1          11.99

Оба значения являются значениями, действовавшими для самой последней pceffdate для этого кода элемента.

Это может вызвать проблемы с выбором mlist в ld_cost для itemcode 1, потому что есть два совпадающих значения, а скалярное ld_cost может содержать только одно.

Вам действительно нужно посмотреть на данные в закупочной стоимости. Если для одного элемента возможно иметь более одной записи с разными значениями mlist для одной и той же даты / времени, вам необходимо решить, как это следует обрабатывать. Возможно, возьмите самое высокое значение, или самое низкое значение, или любое значение. Или, возможно, это ошибка в данных.

1 голос
/ 11 февраля 2010

Эта строка

SELECT MAX(z.`pceffdate`) FROM `purchcost` z WHERE z.`itemcode` = a.`itemcode`
    AND z.`pceffdate` <= TDATE

должно быть проблемой. Должно быть возвращено более 1 строки. Таким образом, СУБД пытается установить несколько значений для одной и той же вещи, что, конечно, она не может сделать.

Вам нужно что-то еще в предложении WHERE?

0 голосов
/ 14 марта 2016

Существует еще одна возможность: ваш параметр "TDATE" совпадает с именем поля таблицы в верхнем или нижнем регистре или в смешанном виде такие как «tdate», «tDate», «TDATE».

так что вы должны это проверить. Я ударил это раньше.

0 голосов
/ 17 ноября 2014

Вот правильное решение. Посмотрите на мой ответ на этот вопрос Ошибка MySQL 1172 - Результат состоит из более чем одной строки

Спасибо.

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