2010-02-11 44 views
11

Hola estoy teniendo un momento difícil con este procedimiento almacenado. Estoy obteniendo el error: El resultado consistió en más de una fila.El resultado consistió en más de una fila Error 1172 mysql

aquí es mi procedimiento almacenado:

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 ; 

Cualquier soluciones y recomendaciones son muy apreciados!

+0

Tome un vistazo a mi respuesta a esta pregunta [MySQL Error 1172 - Resultado consistió en más de una fila] [1] Gracias. [1]: http://stackoverflow.com/questions/9507993/mysql-error-1172-result-consisted-of-more-on-one-row –

Respuesta

1

Esta línea

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

tiene que ser el problema. Debe devolver más de 1 fila. Entonces, el DBMS intenta establecer múltiples valores para la misma cosa, lo que por supuesto no puede hacer.

¿Necesita algo más en su cláusula WHERE allí?

6

yo diría que el problema está aquí:

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

y causada por esta volviendo más de una fila. Cómo lo resuelve depende de sus requisitos. ¿La existencia de múltiples filas implica que la base de datos necesita alguna limpieza, por ejemplo? ¿O debería tomar el primer valor de "costo", o quizás la suma de todos los "costos" para id = ls_id?

Editar:

Su cláusula INTO está intentando escribir varias filas de una sola variable. En cuanto a su SQL, diría que el problema subyacente es que su consulta inicial para retirar solo el costo más reciente para cada ID está siendo obstaculizada por duplicados de pceffdate. Si este es el caso, este 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 

volverá más filas que simplemente esto:

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 
+0

ya tiene un DISTINCTROW por lo que solo devolverá 1 ¿derecho? ¿Me puede recomendar una solución? – ryn6

+0

Eso no es lo que hace DISTINCTROW (que, por cierto, es sinónimo de DISTINCT). Si tiene varios valores diferentes para el costo de cada identificación, DISTINCT/DISTINCTROW devolverá varias filas. DISTINCT/DISTINCTROW simplemente significa que no tendrá filas duplicadas. Entonces, por ejemplo, si tiene 3 filas con valores de 50, 50 y 100, DISTINCT/DISTINCTROW devolverá 2 filas (una con 50 y una con 100). – MartW

+0

umm, entonces debería eliminar DISTINCTROW de esa línea? . Quité la cosa DISTINCTROW en mi staement seleccionado y todavía da el mismo error – ryn6

1

El problema es que

SELECT DISTINCTROW `itemcode` ID, `mlist` COST 

podría almacenar múltiples costas a cada ID, y así

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

podría devolver varias filas para cada identificación.

Por ejemplo, si purchcost contenía lo siguiente:

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

Entonces prod_itemcost tabla temporal debería contener:

itemcode mlist 
1   10.99 
1   11.99 

Estos siendo ambos valores que estaban en vigor en el más reciente pceffdate para que itemcode .

Esto causaría un problema al seleccionar mlist en ld_cost para itemcode 1 porque hay dos valores que coinciden, y el escalar ld_cost solo puede contener uno.

Realmente necesita ver los datos en purchcost. Si es posible que 1 elemento tenga más de una entrada con diferentes valores de lista para la misma fecha/fecha y hora, entonces debe decidir cómo se debe manejar.Tal vez tome el valor más alto, o el valor más bajo, o cualquier valor. O tal vez esto es un error en los datos.

+0

uhmm estoy un poco confundido. Lo que necesito en la tabla temporal prod_itemcost es obtener todos los precios más recientes por producto. – ryn6

0

Existe otra posibilidad, que es su parámetro "TDATE" igual que el nombre del campo de la tabla en mayúsculas, minúsculas o mixto. como 'tdate', 'tDate', 'TDATE'.

, así que deberías comprobarlo. Golpeé esto antes

Cuestiones relacionadas