SQL de actualización Aflicciones en MS Access - La operación debe usar una consulta actualizable

StackOverflow https://stackoverflow.com/questions/537161

  •  22-08-2019
  •  | 
  •  

Pregunta

Tengo una consulta de selección que realiza alguna manipulación de texto para cambiar el formato de un campo esencialmente de modo que pueda mirar hacia arriba en otra tabla:

Si mi primera tabla si tengo un campo como "J1 / 2" que 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 no tengo que hacer búsquedas utilizando esta manipulación de cadenas más, pero mis intentos de consultas de actualización terminar con "La operación debe usar una consulta actualizable"

¿Alguna idea?

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*";

Recall -. Esto funciona bien y me da la t2.ID necesaria por el otro extremo

Así que 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*";

Sólo esta falla. Esto es en sí mismo MS Access por lo que no se puede imaginar un problema de permisos reales como la mayor parte de la "operación debe usar una consulta actualizable" problemas parecen ser.

EDIT:. Tratando de simplificar el caso de que no funciona

Esta consulta UPDATE está bien:

UPDATE t1
SET t2ID="Unknown"
WHERE TN LIKE "J?/?"
AND DD LIKE "M*";

Esta falla (Gracias Goedke -. Obviamente este ejemplo falla porque la subconsulta devuelve más de 1 resultado me había simplificado para tratar de encontrar mi problema)

UPDATE t1
SET t2ID=(SELECT ID FROM t2)
WHERE TN LIKE "J?/?"
AND DD LIKE "M*";

Así que no sólo tengo a mi sintaxis subconsulta mal de alguna manera?

EDIT: Esta instrucción SELECT está muy bien también:

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, utilizando recuento en la instrucción de selección anterior muestra que hay exactamente 1 Identificación siendo devuelto por (DD, TN) combinación

EDIT:

El caso más simple ahora tengo que - usando varios comandos SELECT que ahora tengo una tabla con sólo 2 columnas -. La clave primaria de T1 y el valor que desea insertar en t1

Todavía parece que no puede escribir

UPDATE t1 SET t1.f2 = (SELECT t2.f2 FROM t2 WHERE t2.f1 = t1.f1)

donde la clave primaria de t1 es f1. Incluso la adición DONDE EN T1.F1 (f1 SELECT FROM t2) no ayuda. (Añadido para eliminar la posibilidad de que retorna la subconsulta 0 resultados)

¿Fue útil?

Solución

Una subconsulta de (SELECT ID DE t2) no puede funcionar a menos que haya sólo un registro en t2. ¿Qué espera usted de identificación para ser utilizado?

El mensaje de error que se está informando que normalmente se produce cuando tiene une y no está incluyendo todas las claves primarias necesarias para actualizar de nuevo a las tablas de una forma enlazada a datos (por ejemplo, su DISTINCT originales destruye información sobre las teclas, por lo que si se une a una forma, la forma no sería capaz de salvar la espalda).

El hecho de que está usando DISTINCT no me haría más sospechoso que la consulta sub vuelve 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 consulta substitución:.-Bajo restringir la cláusula where

Otro problema que he visto con la asignación de una sub consulta es si el sintaxis de la consulta interna es incorrecta. Por lo menos con SQL 2000 y la parte final de 2005, el procesador de consultas será en silencio fallar y devolver NULL en tales casos. (Esto es, por lo que yo puedo decir, un error:. No veo ninguna razón por qué algo que devolverá un error en el nivel superior se permitiría en silencio en una subconsulta ... pero es así)

EDIT: Sólo para asegurarse de que ni Pablo o que no se estaba volviendo loco, he creado las siguientes tablas:

t1 | ID, FK, Data
t2 | ID2, Data2

Lo hice no poner ninguna restricción, excepto una clave principal en ID e ID2. Todos los campos estaban texto, que es diferente de lo que normalmente utilizo para los ID, pero deben ser irrelevante.

t1:

ID  FK  Data
Key1        Data1
Key2        Data2
Key3        Data3

t2:

ID2 Data2
Key1    DataA
Key2    DataB
Key3    DataC

Una consulta de la forma:

UPDATE t1 SET t1.FK = (select ID2 from t2 where t2.ID2 = t1.ID);

No se pudo con el mismo mensaje Paul consiguió.

select *, (select ID2 from t2 where t2.ID2 = t1.ID) as foreign from t1, 

funciona como se esperaba, por lo que conocer la sintaxis subconsulta no tiene la culpa.

UPDATE t1 SET t1.FK = 'Key1'

También funciona como se espera, por lo que no tenemos un destino actualizable está corrupta o no.

Nota: si cambio de la base de datos backend del nativa de SQL 2005, la actualización funciona! Un poco de google alrededor, y me encuentro con acceso MVP sugiriendo DLookUp para reemplazar una subconsulta:

http://www.eggheadcafe.com/software/ Red PEA / 31849054 / update-con-subquerycomp.aspx

Al parecer, este es un error en el acceso a SQL, que se evita cuando se utiliza un back-end SQL Express 2000 o superior. (El Google Resultados para "actualizar el acceso subconsulta" apoyar esta teoría).

Vea aquí cómo utilizar esta solución: http: //www.techonthenet .com / acceso / funciones / dominio / dlookup.php

Otros consejos

Tengo que sopesar con el comentario de David W. Fenton en el OP.

Esto es muy molesto problema con Jet / ACE. Pero trate ya sea:

  1. ir a las propiedades de la consulta (haga clic el fondo del cristal en que el se muestran las tablas) y establecer 'Unique Records' a 'Sí'
  2. Opción 1 es el equivalente de añadir el mirar un poco extraño DISTINCTROW a la palabra clave cláusula SELECT, por ejemplo

:

UPDATE DISTINCTROW tblClient 
       INNER JOIN qryICMSClientCMFinite 
          ON tblClient.ClientID = qryICMSClientCMFinite.ClientID
   SET tblClient.ClientCMType = "F";

Esto resuelve muchos problemas relacionados con este mensaje de error que es casi ridículo.

Eso es MS Access en pocas palabras - si usted no sabe la solución de secreto comercial para el problema de x, puede tomar días tratando de encontrar la respuesta. Conocer las 10.000 soluciones es tener acceso a programar. ¿Es eso suficiente de una 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;

Me havent't leer todo el hilo, pero esta es la solución que estoy utilizando:

update (select * from t1 inner join t2 on t1.key = t2.key) set t1.field1 = t2.field2

y que funciona bien en MS Access para mí.

Mi solución fue cambiar mi sql en ese camino.

  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

Yo tenía el mismo error ( "La operación debe usar una consulta actualizable") utilizando el acceso de 2010 y estaba realizando un consulta de actualización sencilla con una combinación interna. Todo lo que hice fue agregar una clave principal a la tabla que me unía en (ya tenía uno, por supuesto, en la mesa que estaba poniendo al día) y todo funcionaba.

Para éste: UPDATE t1 SET t1.f2 = (SELECT T2.F2 DE t2 DONDE t2.f1 = T1.F1)

UPDATE t1 INNER JOIN t2 ON t1.f1 = t2.f1 SET t1.f2 = [t2].[f2];
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top