Consultas SQL que Parecen Sencillas...

25/11/2009 - 14:04 por Juan Marcial | Informe spam
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 ID233, 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 ID233)=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...

Preguntas similare

Leer las respuestas

#1 Juan Carlos Leguizamon
25/11/2009 - 14:44 | Informe spam
La primera podría ser:
IF EXISTS (SELECT 1 FROM ApplyCollection WHERE ID1='ALGO' And ID233)
UPDATE ApplyCollection SET UpdateTime = GETDATE()
WHERE ID1='ALGO' And ID233
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" escribió en el mensaje
news:
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 ID233, 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 ID233)=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...


Respuesta Responder a este mensaje
#2 Carlos Sacristan
25/11/2009 - 15:55 | Informe spam
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
ID233

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" wrote in message
news:
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 ID233, 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 ID233)=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...


Respuesta Responder a este mensaje
#3 Juan Marcial
25/11/2009 - 16:54 | Informe spam
...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 ID233) ...
(2)
IF (SELECT COUNT(*) FROM ApplyCollection WHERE ID1='ALGO' And ID233)=0 ...

Bueno, imagino que la (1)...

Muchas gracias.
Juan Marcial
Ingeniero de Software


"Juan Marcial" wrote:

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 ID233, 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 ID233)=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...


Respuesta Responder a este mensaje
#4 Juan Marcial
25/11/2009 - 16:58 | Informe spam
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:

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
ID233

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" wrote in message
news:
> 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 ID233, 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 ID233)=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...
>
>

.

Respuesta Responder a este mensaje
#5 Carlos Sacristan
25/11/2009 - 17:30 | Informe spam
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" wrote in message
news:
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:

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
ID233

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" wrote in message
news:
> 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 ID233, 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 ID233)=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...
>
>

.

Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida