2011-03-14 24 views
6

Necesito escribir una consulta SQL para MS Access 2000 para que se actualice una fila, si existe, pero insertada si no lo hace.Consulta de acceso SQL: actualice la fila si existe, inserte si no lo hace

decir

Si existe fila ...

UPDATE Table1 SET (...) WHERE Column1='SomeValue' 

Si no existe ...

INSERT INTO Table1 VALUES (...) 

se puede hacer esto en una consulta?

(EN DUPLICATE KEY UPDATE method El que trabaja en MySQL no parece trabajar aquí.)

+2

La simple respuesta es No. Sin embargo, puede escribir un procedimiento que utiliza VBA para hacer tal cosa. – shahkalpesh

+0

¿Qué pasa con [Fusionar declaración] [1]? [1]: http://technet.microsoft.com/en-us/library/bb510625.aspx – mcha

+0

@mcha: ¿'MERGE' funciona con Access? –

Respuesta

7

no en una consulta, pero que podría hacer dos consultas de múltiples filas.

En MySQL, el equivalente es (como ya saben :)

INSERT INTO Table1 (...) 
    VALUES(...) 
ON DUPLICATE KEY 
    UPDATE column=column+1 
; 

o

INSERT INTO Table1 (...) 
    (SELECT ... 
     FROM ... 
    ) 
ON DUPLICATE KEY 
    UPDATE column=column+1 
; 

La segunda forma se puede escribir con dos consultas como:

UPDATE Table1 
    SET (...) 
    WHERE Column1 = 'SomeValue' 
; 

INSERT INTO Table1 (...) 
    (SELECT ... 
     FROM ... 
     WHERE 'SomeValue' NOT IN (SELECT Column1 
             FROM Table1) 
    ) 
; 

También puede invertir el orden e insertar primero las nuevas filas y luego actualizar todas las filas si eso se ajusta mejor a sus datos.

* Tenga en cuenta que los IN y NOT IN subconsultas podrían posiblemente convertidos en equivalentes JOIN y LEFT JOIN with check for NOT NULL formas.

-1

Esto no se aplica directamente a Access [EDIT: David-W-Fenton afirma que esto no es posible en el acceso], pero está completo (en caso de que alguien leyendo esto está interesado en algo más allá de Acceso):

He tenido éxito en Microsoft SQL Server utilizando un enfoque que debería ser más eficiente, ya que solo tiene que hacer una comprobación de índice, en lugar de dos. Aquí está un ejemplo de mi proyecto actual:

UPDATE ActivityRelationships 
SET [Count] = ([Count] + 1) 
WHERE [email protected] AND [email protected] 
IF @@ROWCOUNT=0 
    INSERT INTO ActivityRelationships ([ActivityBeforeId], [ActivityAfterId], [Count]) 
    VALUES (@activityBeforeId, @activityAfterId, 1) 
+3

No se puede hacer en Access. -1 por publicar una respuesta que es inútil para la pregunta específica. –

+0

No propongo esto como una solución definitiva a la pregunta, solo algo que valdría la pena investigar si es posible. –

+1

"Esto no se aplica directamente a Access" en una pregunta sobre el acceso debería haber sido su sugerencia de que recibiría downvoted. –

Cuestiones relacionadas