Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Consultas SQL que Parecen Sencillas...

11 views
Skip to first unread message

Juan Marcial

unread,
Nov 25, 2009, 8:04:02 AM11/25/09
to
Buenas-

Como trabajo principalmente en otros lenguajes, conozco muy someramente el
lenguaje del SQL. Quisiera poder ejecutar una orden con el siguiente criterio
(muy simple)

“Si no existe en la tabla [ApplyCollection] un registro con claves ID=ALGO,
y ID2=333, créelo, de lo contrario actualice solo el campo UpdateTime con la
fecha / hora del servidor.

En primera instancia se me ocurre:

if (select * from [ApplyCollection] where ID1='ALGO' and ID2=333)=0
insert into [ApplyCollection] (ID1,ID2,UpdateTime)
values ('ALGO',333,(select { fn now() }))
else
update [_ApplyCollection] set UpdateTime=(select { fn now() })

Me devuelve el error:
Subqueries are not allowed in this context. Only scalar expressions are
allowed.

--

Segunda pregunta. Quisiera contar los registros que no se repiten en una
tabla. Se me ocurre algo simple como:

select count(*) from (select distinct * from [TableName])

Me devuelve error de sintaxis (que ignorancia la mía) ¿Cómo en una sola
genciana SQL obtengo los registros que no se repiten?

Agradeceré hasta la luna su sabios consejos...


Juan Carlos Leguizamon

unread,
Nov 25, 2009, 8:44:02 AM11/25/09
to

La primera podr�a ser:
IF EXISTS (SELECT 1 FROM ApplyCollection WHERE ID1='ALGO' And ID2=333)
UPDATE ApplyCollection SET UpdateTime = GETDATE()
WHERE ID1='ALGO' And ID2=333
ELSE
INSERT INTO ApplyCollection (ID1, ID2, UpdateTime) VALUES ('ALGO', 333,
GETDATE())

En la segunda, la soluci�n que se te ocurre es valida, solo que T-SQL
requiere que la subconsulta tenga un alias:
select count(*) from (select distinct * from [TableName]) AS x

Saludos,

Juan Carlos Leguizamon


"Juan Marcial" <eslend...@hotmail.com> escribi� en el mensaje
news:A00D041B-C511-4553...@microsoft.com...


> Buenas-
>
> Como trabajo principalmente en otros lenguajes, conozco muy someramente el
> lenguaje del SQL. Quisiera poder ejecutar una orden con el siguiente
> criterio
> (muy simple)
>
> "Si no existe en la tabla [ApplyCollection] un registro con claves
> ID=ALGO,

> y ID2=333, cr�elo, de lo contrario actualice solo el campo UpdateTime con

> la
> fecha / hora del servidor.
>
> En primera instancia se me ocurre:
>
> if (select * from [ApplyCollection] where ID1='ALGO' and ID2=333)=0
> insert into [ApplyCollection] (ID1,ID2,UpdateTime)
> values ('ALGO',333,(select { fn now() }))
> else
> update [_ApplyCollection] set UpdateTime=(select { fn now() })
>
> Me devuelve el error:
> Subqueries are not allowed in this context. Only scalar expressions are
> allowed.
>
> --
>
> Segunda pregunta. Quisiera contar los registros que no se repiten en una
> tabla. Se me ocurre algo simple como:
>
> select count(*) from (select distinct * from [TableName])
>

> Me devuelve error de sintaxis (que ignorancia la m�a) �C�mo en una sola


> genciana SQL obtengo los registros que no se repiten?
>

> Agradecer� hasta la luna su sabios consejos...
>
>


Carlos Sacristan

unread,
Nov 25, 2009, 9:55:05 AM11/25/09
to
Respecto a la primera pregunta, una forma eficiente de hacerlo es:

<intento actualizar>
<si no ha actualizado ninguna fila, es que no existe>
<por tanto, inserto>

UPDATE [_ApplyCollection] SET UpdateTime = GETDATE() WHERE ID1='ALGO' AND
ID2=333

IF @@ROWCOUNT = 0
INSERT INTO [ApplyCollection] (ID1,ID2,UpdateTime)


VALUES ('ALGO', 333, GETDATE())


--
-----------------------------
"Caminar sobre el agua y desarrollar software a partir de unas
especificaciones es fácil, si ambas están congeladas."
Edward V. Berard, ingeniero informático


"Juan Marcial" <eslend...@hotmail.com> wrote in message
news:A00D041B-C511-4553...@microsoft.com...

Juan Marcial

unread,
Nov 25, 2009, 10:54:06 AM11/25/09
to
...Aprendí mucho hoy...

Solo una preguntita más ¿Que es mas eficiente en rendimiento?
(1)
IF EXISTS (SELECT 1 FROM ApplyCollection WHERE ID1='ALGO' And ID2=333) ...
(2)
IF (SELECT COUNT(*) FROM ApplyCollection WHERE ID1='ALGO' And ID2=333)=0 ...

Bueno, imagino que la (1)...

Muchas gracias.
--
Juan Marcial
Ingeniero de Software

Juan Marcial

unread,
Nov 25, 2009, 10:58:01 AM11/25/09
to
Interesante...

Pero. Esto:


<intento actualizar>
<si no ha actualizado ninguna fila, es que no existe>
<por tanto, inserto>

¿En termininos de T-SQ como es?


--
Juan Marcial
Ingeniero de Software


"Carlos Sacristan" wrote:

> .
>

Carlos Sacristan

unread,
Nov 25, 2009, 11:30:54 AM11/25/09
to
Era una especie de pseudocódigo. En TSQL te lo puse justo después

--
-----------------------------
"Caminar sobre el agua y desarrollar software a partir de unas
especificaciones es fácil, si ambas están congeladas."
Edward V. Berard, ingeniero informático


"Juan Marcial" <eslend...@hotmail.com> wrote in message

news:A2528329-ED02-4343...@microsoft.com...

Carlos Sacristan

unread,
Nov 25, 2009, 11:33:03 AM11/25/09
to
Lo puedes comprobar tú mismo viendo el plan de ejecución de ambas consultas,
aunque intuyes bien.

Una cosa a tener en cuenta: ambas condiciones son contrarias. La primera es
verdadera si existe algún registro que cumpla esas condiciones; la segunda
es válida si NINGÚN registro cumple esas condiciones.

--
-----------------------------
"Caminar sobre el agua y desarrollar software a partir de unas
especificaciones es fácil, si ambas están congeladas."
Edward V. Berard, ingeniero informático


"Juan Marcial" <eslend...@hotmail.com> wrote in message

news:2894DBC8-51EC-49B8...@microsoft.com...

Juan Marcial

unread,
Nov 25, 2009, 4:02:03 PM11/25/09
to
Gracias. Me fue supremamente util.

Jose Antonio Martínez

unread,
Nov 27, 2009, 7:40:50 PM11/27/09
to
Y que pasa con la instruccion merge, que nadie la utiliza?

"Juan Marcial" <eslend...@hotmail.com> escribió en el mensaje de
noticias:A00D041B-C511-4553...@microsoft.com...

Carlos Sacristan

unread,
Nov 30, 2009, 7:56:32 AM11/30/09
to
MERGE sólo está disponible en 2008. Si no se dice qué versión de SQL Server
se usa, habrá que dar una solución que funcione en cualquiera de ellas...

--
-----------------------------
"Caminar sobre el agua y desarrollar software a partir de unas
especificaciones es fácil, si ambas están congeladas."
Edward V. Berard, ingeniero informático


"Jose Antonio Martínez" <jama...@hotmail.com> wrote in message
news:712D87D5-B88E-49EC...@microsoft.com...

0 new messages