Tengo una tabla que actualizar usando registros de otra tabla y estoy haciendo esto para traer información de un sistema (base de datos) a otro. El escenario es poco compleja, pero que desesperadamente necesitan ayuda :-s
SQL INNER QUERY devuelve más de un valor en una consulta UPDATE
Hay 3 mesas - component
, scan
y stage_link
componentes
component_id stage_id
------------ --------
1 NULL
2 NULL
3 NULL
4 NULL
5 NULL
exploración
scan_id component_id scanner_id date_scanned
------- ------------ ---------- -----------------------
1 1 scanner_a 2012-01-01 07:25:15.125
2 1 scanner_b 2012-01-02 08:14:05.456
3 2 scanner_a 2012-01-01 12:05:45.465
4 3 scanner_a 2012-01-01 19:45:12.536
5 1 scanner_c 2012-01-03 23:33:54.243
6 2 scanner_b 2012-01-02 11:59:12.545
stage_link
stage_link_id scanner_id stage_id
------- ---------- ----------
1 scanner_a 1
2 scanner_b 1
3 scanner_c 2
4 scanner_d 2
5 scanner_e 2
6 scanner_f 3
necesito update
la tabla component
y set
el campo stage_id
según la última exploración. Cada exploración lleva el componente a un nivel de acuerdo con el escáner involucrado. He escrito la siguiente consulta para update
la tabla component
, pero arroja un error que dice;
Subquery returned more than 1 value. This is not permitted when the subquery follows '='
La consulta es;
UPDATE component
SET stage_id = (select stage_id
from(
select scn.scanner_id, sl.stage_id
from scan scn
INNER JOIN stage_link sl ON scn.scanner_id = sl.scanner_id
where scn.date_scanned = ( select temp_a.max_date
from ( SELECT x.component_id, MAX(x.date_scanned) as max_date
FROM scan x
where component_id = x.component_id
GROUP BY x.component_id
) as temp_a
where component_id = temp_a.component_id)
) as temp_b
)
estoy trabajando en MS SQL Server
y quiero resolver esto sin usar PHP
o cualquier otro idioma.
He intentado por un día hacer que esto funcione, pero todavía no conseguí una forma de hacer que esto funcione. ¡Cualquier ayuda sería muy apreciada!
Muchas gracias de antemano :-)
¡Muchas gracias por esta sugerencia! ¡fue de gran ayuda! ¡Esto es exactamente lo que quería! :-) ¡¡¡¡¡De nuevo, muchas gracias!!!!! – mithilatw
@mithilatw: De nada. Tenga en cuenta que puede haber 2 problemas con esta consulta (para referencia futura): (1) Esto supone que el date_scanned siempre es único. Si 2 escáneres escanean al mismo tiempo (hasta la parte de nanosegundos), entonces 'SELECT component_id, scanner_id' devolverá 2 valores. (2) Los campos en la combinación 'Temp2.scanner_id = SL.scanner_id' son columnas basadas en char, por lo tanto, si tiene muchos scanner_ids, entonces esta consulta podría comenzar a ralentizarse. – Kash