operacion - Problemas de SQL Update en MS Access: la operación debe usar una consulta actualizable
la operacion debe usar una consulta actualizable vba (7)
Para este: UPDATE t1 SET t1.f2 = (SELECCIONE t2.f2 FROM t2 WHERE t2.f1 = t1.f1)
UPDATE t1 INNER JOIN t2 ON t1.f1 = t2.f1 SET t1.f2 = [t2].[f2];
Tengo una consulta de selección que hace algo de manipulación de texto para reformatear un campo esencialmente para que pueda buscarlo en otra tabla:
Si mi primera tabla tiene un campo como "J1 / 2", busca el ID de un registro en una tabla diferente con J1 y J2 en los campos correspondientes.
Todo esto funciona bien
Ahora quiero actualizar la tabla original, así que ya no tengo que hacer búsquedas usando esta manipulación de cadena, pero mis intentos de actualización terminan con "La operación debe usar una consulta actualizable".
¿Algunas ideas?
Mi instrucción SELECT:
SELECT DISTINCT
t1.DD,
t1.TN,
t1.DD & " J" & MID(t1.TN,2,1) AS CalculatedStart,
t1.DD & " J" & MID(t1.TN,4,1) AS CalculatedEnd,
t2.ID
FROM t1 INNER JOIN t2
ON (t1.DD & " J" & MID(t1.TN,2,1)=t2.StartLink)
AND (t1.DD & " J" & MID(t1.TN,4,1)=t2.EndLink)
WHERE t1.TN Like "J?/?"
AND t1.DD Like "M*";
Recuerde, esto funciona bien y obtengo el t2.ID necesario en el otro extremo.
Entonces quiero hacer algo como:
UPDATE t1 SET t2ID = (
SELECT Query1.ID
FROM Query1
WHERE t1.DD=Query1.DD
AND t1.TN=Query1.TN
)
WHERE t1.TN Like "J?/?"
AND t1.DD Like "M*";
Solo esto falla. Esto está dentro de MS Access, por lo que no puedo imaginarme un problema de permisos reales, como la mayoría de los problemas de la "Operación debe usar una consulta actualizable".
EDITAR: tratando de simplificar el caso que no funciona.
Esta consulta de ACTUALIZACIÓN está bien:
UPDATE t1
SET t2ID="Unknown"
WHERE TN LIKE "J?/?"
AND DD LIKE "M*";
Éste falla (gracias a Goedke: este ejemplo obviamente falla porque la subconsulta arroja más de 1 resultado. Había simplificado demasiado para tratar de encontrar mi problema)
UPDATE t1
SET t2ID=(SELECT ID FROM t2)
WHERE TN LIKE "J?/?"
AND DD LIKE "M*";
Entonces, ¿tengo mal la sintaxis de mi subconsulta de alguna manera?
EDITAR: Esta declaración SELECT también está bien:
SELECT t1.OA, t1.DD, t1.TN, t1.HATRIS,
query1.DD, query1.TN, query1.ID
FROM t1 INNER JOIN query1
ON t1.DD=query1.DD
AND t1.TN=query1.TN
Además, al utilizar recuento en la instrucción de selección anterior, se muestra que se devuelve exactamente 1 ID por combinación (DD, TN)
EDITAR:
El caso más simple que he tenido ahora - usando varias instrucciones SELECT ahora tengo una tabla con solo 2 columnas - la clave principal de t1 y el valor que quiero insertar en t1.
Todavía no puedo escribir
UPDATE t1 SET t1.f2 = (SELECT t2.f2 FROM t2 WHERE t2.f1 = t1.f1)
donde la clave principal de t1 es f1. Incluso agregar WHERE t1.f1 IN (SELECCIONAR f1 FROM t2) no ayuda. (Agregado para eliminar la posibilidad de que la subconsulta arroje 0 resultados)
Una subconsulta de (SELECCIONAR ID FROM t2) no puede funcionar a menos que haya solo un registro en t2. ¿Qué identificación esperas que se use?
El mensaje de error que se informa normalmente se produce cuando tiene uniones y no incluye todas las claves primarias necesarias para actualizar a tablas en un formato enlazado a datos (por ejemplo, su DISTINCT original destruye información sobre claves, por lo que si estaba enlazado) a un formulario, el formulario no podría guardar de nuevo).
El hecho de que esté utilizando DISTINCT allí me haría sospechar que la consulta secundaria está devolviendo más de una fila en su ejemplo más complejo. Este es probablemente el problema más común con la asignación de un resultado de sub consulta: restringir la cláusula where.
Otro problema que he visto con la asignación de una subconsulta es si la sintaxis de la consulta interna es incorrecta. Al menos con los back ends SQL 2000 y 2005, el procesador de consultas fallará silenciosamente y devolverá NULL en tales casos. (Esto es, hasta donde puedo decir, un error: no veo ninguna razón por la cual algo que devolverá un error en el nivel superior sería permitido silenciosamente en una subconsulta ... pero ahí está).
EDITAR: solo para asegurarnos de que ni Paul ni yo nos volviéramos locos, creé las siguientes tablas:
t1 | ID, FK, Data
t2 | ID2, Data2
No puse ninguna restricción excepto una clave principal en ID e ID2. Todos los campos eran texto, que es diferente de lo que normalmente uso para los ID, pero debería ser irrelevante.
t1:
ID FK Data
Key1 Data1
Key2 Data2
Key3 Data3
t2:
ID2 Data2
Key1 DataA
Key2 DataB
Key3 DataC
Una consulta del formulario:
UPDATE t1 SET t1.FK = (select ID2 from t2 where t2.ID2 = t1.ID);
Falló con el mismo mensaje que recibió Pablo.
select *, (select ID2 from t2 where t2.ID2 = t1.ID) as foreign from t1,
funciona como se esperaba, por lo que sabemos que la sintaxis de la subconsulta no tiene la culpa.
UPDATE t1 SET t1.FK = ''Key1''
también funciona como se espera, por lo que no tenemos un destino corrupto o no actualizable.
Nota: si cambio el backend de la base de datos de nativo a SQL 2005, ¡la actualización funciona! Un poco de búsqueda en Google, y me parece que Access MVPs sugiere DLOOKUP para reemplazar una subconsulta:
http://www.eggheadcafe.com/software/aspnet/31849054/update-with-subquerycomp.aspx
Aparentemente, este es un error en Access SQL, uno que se evita cuando se usa un servidor SQL Express 2000 o posterior. (Los resultados de google para "subconsulta de actualización de acceso" respaldan esta teoría).
Consulte aquí cómo utilizar esta solución alternativa: http://www.techonthenet.com/access/functions/domain/dlookup.php
Tengo que sopesar el comentario de David W. Fenton sobre el OP.
Este es un problema muy molesto con Jet / ACE. Pero prueba cualquiera de los siguientes:
- vaya a las propiedades de la consulta (haga clic en el fondo del panel donde se muestran las tablas) y configure ''Registros únicos'' a ''Sí''
- La opción 1 es el equivalente a agregar la palabra clave
DISTINCTROW
parece extraña a la cláusulaSELECT
, por ejemplo
:
UPDATE DISTINCTROW tblClient
INNER JOIN qryICMSClientCMFinite
ON tblClient.ClientID = qryICMSClientCMFinite.ClientID
SET tblClient.ClientCMType = "F";
Esto resuelve tantos problemas relacionados con este mensaje de error que es casi ridículo.
Eso es MS Access en pocas palabras: si no conoce la solución comercial-secreta para el problema x, puede tomar días tratando de encontrar la respuesta. Para saber las 10,000 soluciones temporales ES para programar el acceso. ¿Es suficiente advertencia para los no iniciados?
Ben
Esto funcionó para mí (Access 2000)
UPDATE DISTINCTROW T1 inner join T2 on T2.f1 = T1.f1 SET f2 = f2;
Mi solución fue cambiar mi sql de esa manera.
update (select o.pricein, g.pricein from operations o left join goods g on g.id = o.goodid where o.opertype = 4 and o.acct = 1)
set o.pricein = g.pricein
No he leído todo el hilo, pero esta es la solución que estoy usando:
update (select * from t1 inner join t2 on t1.key = t2.key) set t1.field1 = t2.field2
y eso funciona bien en MS Access para mí.
Tuve el mismo error ("La operación debe usar una consulta actualizable") con Access 2010 y estaba realizando una consulta de actualización simple con una combinación interna. Todo lo que hice fue agregar una clave primaria a la mesa en la que me estaba uniendo (ya tenía una, por supuesto, sobre la mesa que estaba actualizando) y todo funcionó.