Pregunta

Es necesario actualizar el campo de comentarios en una mesa para una larga lista de customer_ids. El comentario debe ser actualizado para incluir el comentario existente y añadiendo un poco de texto y la contraseña que está en otra mesa. No estoy muy seguro de cómo hacer esto.

Aquí hay un código que hace esto por una única ID de cliente. ¿Cómo voy a ir haciendo esto para obtener una lista de más de 100 clientes de identificación? mi primer pensamiento es hacer una tabla temporal y el lugar de todos los ID de cliente de allí, pero todavía no estoy seguro de cómo el código después de que desde la customer_id se utiliza en la consulta dos veces.

Update Contract
SET Contract_Comment= Contract_Comment || '; 12/29/2008 Password `' ||
(SELECT Password FROM WLogin WHERE default_customer_id='1234' ) ||'`'|| ' reinstated per Mickey Mouse;'
WHERE Customer_id='1234'
¿Fue útil?

Solución

Bueno, suponiendo Contract_comment tiene una customer_id, o se une fácilmente a una tabla que tiene uno ....

update contract c
set contract_comment = contract_comment || '; 12/29/2008 Password ' ||
(select password from WLogin w where w.default_customer_id = c.customer_id) ||''|| ' reinstated per Mickey Mouse;' WHERE Customer_id in (1234, 4567).

O, sustituir la lista al final con otra subselección ...

donde Customer_Id en (seleccione customer_id de ...).

Otros consejos

Estoy de acuerdo con todo lo que Todd ha declarado, y deseo añadir lo siguiente.

A pesar de que puede no ser obvia, también ha (probable) corregido otro error de su publicación, que está tratando al campo customer_id como una cadena.

Al poner los identificadores entre comillas (por lo menos en su ejemplo) que están obligando a Oracle ya sea a convertir todas las filas a una cadena antes de comparar, o convertir los identificadores que nos has proporcionado a enteros - que tendría que experimentar para determinar las reglas actuales que se aplicarían.

De cualquier manera, es mucho mejor ser consistente con los tipos de datos y no dejarlo hasta la base de datos de averiguarlo.

Usted ha declarado que el código proporcionado era para un solo cliente. Asegúrese de que si se implementa este código en un bucle, que utiliza variables se unen en lugar de sólo la concatenación del ID de cliente en la instrucción SQL que se está construyendo. Si usted está haciendo esto en PL / SQL entonces ha hecho para usted -. En Java u otro lenguaje que tendría que hacer esto por su propia

La respuesta de Todd anterior podría funcionar muy bien usar un IN (o cláusula EXISTS si está almacenando los ID en una tabla temporal que acababa de lo aumento de la siguiente manera:.

UPDATE contract c
   SET contract_comment = nvl2(contract_comment, contract_comment || '; ', '') || '12/29/2008 Password ' ||
                          NVL((SELECT PASSWORD
                                FROM wlogin p
                               WHERE p.default_customer_id = c.customer_id),
                              '<NULL>') || '' || ' reinstated per Mickey Mouse'
 WHERE EXISTS (SELECT 'x' FROM wlogin l WHERE l.default_customer_id = c.customer_id)

Esto asegura que 1) que está manejando si la contraseña es nula y 2) que sólo se actualiza para los clientes con un historial wlogin.

No dude en añadir algo como:

AND EXISTS (SELECT 'y' FROM temp_ids_table t WHERE t.customer_id = c.customer_id)

Gracias por cualquier crédito que da de estas respuestas correctas.

  • Stew
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top