PDA

Ver la Versión Completa : update con tablas relacionadas


rg5820
25-10-2012, 22:42:04
Buenas Tardes.
Tengo 2 tablas en una base firebird
La tabla Articulos y la tabla Items.
La tabla Articulos utiliza el campo Articulos.FK_Items para relacionarse con la tabla Items a travez de Items.ID
La relacion entre Articulos e Items es 1 a 1
Necesito actualizar un campo de la tabla Articulos colocando un valor fijo para el caso en que el campo codigo de la tabla Items tenga un determinado valor es decir algo similar a esto pero que funcione ya que el error que informa es:
"Error ejecutando SQL:
Dynamic SQL Error SQL ERROR code= -104 Token unknown - line 1, column 43 FROM"

La syntaxis que utilizo es:
update ARTICULOS set CODIGO_SEGUNDO = 'X' from ARTICULOS inner join ITEMS on ARTICULOS.FK_ITEMS = ITEMS.ID where (ITEMS.CODIGO= 'AL494J' or ITEMS.CODIGO='F494P')

Muchas gracias por alguna ayuda disponible.

roman
25-10-2012, 22:46:15
A ver, intenta algo así:


update ARTICULOS
inner join ITEMS on ARTICULOS.FK_ITEMS = ITEMS.ID
set CODIGO_SEGUNDO = 'X'
where (ITEMS.CODIGO= 'AL494J' or ITEMS.CODIGO='F494P')


Así sería en MySQL. Crucemos los dedos porque también lo sea en Firebird.

// Saludos

rg5820
25-10-2012, 22:59:20
Por el momento continua dando un mensaje de error.
"Error ejecutando SQL:
Dynamic SQL Error SQL ERROR code= -104 Token unknown - line 2, column 1 INNER"

Muchas Gracias por comunicarte.

roman
25-10-2012, 23:10:06
Entonces intenta esto:


update ARTICULOS
set CODIGO_SEGUNDO = 'X'
where (select CODIGO from ITEMS where ARTICULOS.FK_ITEMS = ITEMS.ID) in ('AL494J', 'F494P')


// Saludos

rg5820
25-10-2012, 23:34:04
Esta estuvo perfecta, funcionó según lo esperado.
Gracias por comunicarte y por tu ayuda.
Muchas muchas gracias

Casimiro Notevi
25-10-2012, 23:37:53
Creo que la sintaxis sería más o menos así:

update articulos
set codigo_segundo = 'X'
where fk_items exists (select id from items where codigo='AL497J' or codigo='F494F' )

Creo que también puedes cambiar exists por in


EDITO: bueno, no he dicho nada, veo que te ha servido la de Román.

rg5820
26-10-2012, 14:40:09
Si si, me ha servido lo de Roman pero gracias por tu aporte y por responder Casimiro. porque justamente estaba necesitando realizar
otra actualizacion con las tablas muy similar a la consulta anterior.
Esta vez se trata de colocar en el campo Articulos.Codigo_segundo='U' para todos aquellos registros que en la tabla Items tengan un
left(items.Codigo,1)='U' es decir que su primer caracter sea igual a 'U' y tu propuesta me ha servido ya que he podido colocar la
siguiente syntaxis y funciono muy bien.

update articulos
set articulos.codigo_segundo = 'U'
where articulos.fk_items in (select items.id from items where left(items.codigo,1)='U' )

Muchisimas gracias.
Muchas gracias por haberte comunicado.

rg5820
26-10-2012, 14:43:35
Gracias Casimiro, tambien me ha servido tu ayuda para otra actualizacion que necesitaba hacer y no sabia como lograrla.
Muchas Gracias.
Pd. Con firebird me ha funcionado la instruccion utilizando In

Creo que la sintaxis sería más o menos así:


Código SQL [-] (http://www.clubdelphi.com/foros/#)update articulos
set codigo_segundo ) = 'X'
where fk_items exists (select id from items where codigo='AL497J' or codigo='F494F' )




Creo que también puedes cambiar exists por in


EDITO: bueno, no he dicho nada, veo que te ha servido la de Román.

Casimiro Notevi
26-10-2012, 15:57:42
Me alegro :)

cointec
29-10-2012, 22:20:25
Creo que la sintaxis sería más o menos así:

update articulos
set codigo_segundo ) = 'X'
where fk_items exists (select id from items where codigo='AL497J' or codigo='F494F' )

Creo que también puedes cambiar exists por in


EDITO: bueno, no he dicho nada, veo que te ha servido la de Román.

Hola, para optimizar la consulta, deberías utilizar 'in' en vez de or, ya que con 'or' no se utilizan índices, cosa que con 'in' sí que ocurre


exists (select id from items where codigo in('AL497J','F494F' ))

Casimiro Notevi
29-10-2012, 22:34:51
Hola, para optimizar la consulta, deberías utilizar 'in' en vez de or, ya que con 'or' no se utilizan índices, cosa que con 'in' sí que ocurre

Aunque para ello deberá tener ese campo indexado. Algo que algunos olvidan :)

roman
29-10-2012, 23:24:18
Aunque a mi me extraña esto del or e in. Acabdo de hacer una prueba con mysql, y en ambos casos usa el índice.

// Saludos

Casimiro Notevi
30-10-2012, 00:14:34
Pues acabo de hacer una prueba con firebird y también usa el índice de ambas formas.

Al González
30-10-2012, 01:04:49
Pues acabo de hacer una prueba con firebird y también usa el índice de ambas formas.
Contribuyo a lo mismo (para evitar que la afirmación de cointec se convierta en un mito).

Hace tiempo hice unas pruebas de "In" contra "Or" en Firebird 1.5, y no solamente en ambos casos usa los índices (era el campo de llave primaria), sino que me resultó más rápida una consulta Select con 10 condiciones Or, que su contraparte In con diez valores separados por coma.

Así que me quedé con Or por ser más rápido. :)

mightydragonlor
30-10-2012, 03:55:44
Contribuyo a lo mismo (para evitar que la afirmación de cointec se convierta en un mito).

Hace tiempo hice unas pruebas de "In" contra "Or" en Firebird 1.5, y no solamente en ambos casos usa los índices (era el campo de llave primaria), sino que me resultó más rápida una consulta Select con 10 condiciones Or, que su contraparte In con diez valores separados por coma.

Así que me quedé con Or por ser más rápido. :)

Claro, finalmente el parser debe cambiar toda la lista del IN para dejar la consulta con OR, pero supongo que la diferencia no debió ser mucha, por otro lado es mucho mas fácil usar IN que OR, si se hace desde un store procedure.

Saludos.

Al González
31-10-2012, 00:06:09
Claro, finalmente el parser debe cambiar toda la lista del IN para dejar la consulta con OR, pero supongo que la diferencia no debió ser mucha, por otro lado es mucho mas fácil usar IN que OR, si se hace desde un store procedure.
Desconozco qué hace con exactitud el analizador sintáctico de Firebird, pero el código de aquellas pruebas estaba precisamente dentro de un procedimiento almacenado. Suelo usar In, pero como esa operación era crítica, opté por Or. No recuerdo ahora la diferencia de tiempos, aunque ciertamente me parecía poca para un caso normal.

Saludos. :)

Delphius
31-10-2012, 01:41:20
El uso del índice es INDEPENDIENTE de si se emplea IN u OR.
Por lo general, y para cualquier motor de bases de datos, una consulta con IN es más lenta debido a que se requiere lanzar tantas subconsultas como criterios a evaluar dentro de IN existan. No es lo mismo, si se puede, enfocarlo desde una evaluación booleana como OR ya que el analizador detecta estos y puede optimizar mejor el proceso.

Internamente, de lo que vagamente tengo entendido y leído, Firebird tiene un árbol-AND-OR o algo por el estilo que le permite hacer evaluaciones y comprobaciones de una manera efectiva y puede filtrar los registros en la propia consulta. En cambio, cuando hay un IN se emite la misma consulta para cada valor a fin de determinar si corresponde o no filtrarlo.

Saludos,

cointec
31-10-2012, 21:11:41
Tenéis razón, estaba equivocado, no sé porque tenía esta idea y siempre que es posible utilizo in en vez de or.

Casimiro Notevi
31-10-2012, 21:19:31
Quien tiene boca, se equivoca :D

Lo mismo en versiones anteriores era como has contado :)

Al González
31-10-2012, 21:34:38
Lo mismo en versiones anteriores era como has contado :)
Seguro Microsoft SQL Server no usa índices ni con In ni con Or. ;)

:D (este mito sí hay que extenderlo) :D

roman
31-10-2012, 21:37:50
Chuck Norris tampoco, pero él no los necesita.

// Saludos

mightydragonlor
31-10-2012, 21:44:39
Seguro Microsoft SQL Server no usa índices ni con In ni con Or. ;)

:D (este mito sí hay que extenderlo) :D
La verdad es que SQL Server es un muy buen motor de base de datos, muy estable y muy buen rendimiento, lo bueno es que el SQL Managment Studio viene con un visualizados de Plan de Ejecución bastante intuitivo, y si, usa indices con IN y OR, aunque prefiero Firebird, mi experiencia con SQL Server, es bastante buena.

Casimiro Notevi
31-10-2012, 22:10:29
SQL Server es un muy buen motor de base de datos
Sí, los SQL Server son buenos: firebird, postgresql, mysql, etc. ;)

mightydragonlor
31-10-2012, 22:12:06
Sí, los SQL Server son buenos: firebird, postgresql, mysql, etc. ;)
Bueno, mea culpa, claro que la culpa es mas de microsoft, por que ese es el nombre que le pusieron xD

Casimiro Notevi
31-10-2012, 22:44:30
Sí, fueron muy "pillos" con el nombre :)