Select entre parentesis

10/02/2008 - 20:37 por csharp1 | Informe spam
Que tal amigos,
tengo una situacion y es la siguiente,
hay una tabla llamada TABLAX que contiene 50 registros pero al hacer un
select entre parentesis no arroja resultados y no se porque. El select es
asi:
select * from tablax --> asi arroja 50 registros
(select * from tablax) > asi no arroja registros

y me esta afectando con uso ese select como una subconsulta asi:

select 1 from TABLAZETA
where CampoZeta not in (select CampoX
from TABLAX
where CONDICIONES)

y como veran, necesito colocar los parentisis y no se como hacer entonces =(

Preguntas similare

Leer las respuestas

#6 Alejandro Mesa
12/02/2008 - 00:23 | Informe spam
Penta,

Yo creo que al menos la prueba la puedes hacer.

CREATE TABLE dbo.t1 (
c1 INT NULL
)
GO

CREATE TABLE dbo.t2 (
c1 INT NULL
)
GO

INSERT INTO dbo.t1(c1) VALUES(NULL)
INSERT INTO dbo.t1(c1) VALUES(1)
INSERT INTO dbo.t1(c1) VALUES(2)

INSERT INTO dbo.t2(c1) VALUES(NULL)
INSERT INTO dbo.t2(c1) VALUES(1)
GO

SELECT *
FROM dbo.t1
WHERE c1 NOT IN (SELECT c1 FROM dbo.t2)
GO

SELECT *
FROM dbo.t1 AS a
WHERE NOT EXISTS (
SELECT *
FROM dbo.t2 AS b
WHERE b.c1 = a.c1
)
GO

DROP TABLE dbo.t1, dbo.t2
GO

Te parece raro el resultado?

La primera sentencia "select" deberia supuestamente haber devuelto c1 = 2,
pero como te das cuenta, no retorna valor alguno.

La segunda, la cual usa NOT EXISTS, al menos devuelve c1 = 2, pero tambien
incluye NULL, puesto que EXISTS (NULL = NULL) es NULL y NOT NULL es NULL.


AMB


"Penta" wrote:

Hola Alejandro.

Por ejemplo, esto es lo tipico que hacen los desarrolladores:

Si tengo TABLAX valores 1 y 2 y TABLAY valor 1

Select * from TABLAX
Where valores not in (Select valor from TABLAY)

Que podria pasar en dicho caso si en ambas tablas tengo valores
NULL ?? y que pasa si no los tengo ??

Salu2 y gracias.
PENTA.





Respuesta Responder a este mensaje
#7 Penta
12/02/2008 - 16:26 | Informe spam
TODA LA RAZON !!!!
Ahora me puedes explicar porque no retorna 2 ???

Mil gracias.
Penta.
Respuesta Responder a este mensaje
#8 Penta
12/02/2008 - 17:18 | Informe spam
Estimado Alejandro.
Con estas 3 querys obtengo el resultado deseado:

1.-

SELECT *
FROM tabla1 AS a
WHERE NOT EXISTS (
SELECT *
FROM tabla2 AS b
WHERE b.c1 = a.c1
)


2.-
SELECT *
FROM tabla1
WHERE c1 NOT IN (SELECT c1 FROM tabla2 where c1 is not null)
or c1 is null

3.-
select t1.c1
from tabla1 t1
left join tabla2 t2 on
t1.c1=t2.c1
where t2.c1 is null

Planes de Ejecucion (ojala me puedas ayudar ya que NO los entiendo)

1.-
Select Costo 0% - Nested Loops/Left Anti Semi Join Costo 0%- Table
Scan 50% - Table Scan 50%

2.-
Select Costo 0% - Filter 0% - Nested Loops/Left Semi Join Costo 0%-
Table Scan 50% - Row Count Spool/Lazy Spool 0 % - Table Scan 50%

3.-
Select Costo 0% - Filter 0% - Nested Loops/Left Outer Join Costo 0%-
Table Scan 50% - Table Scan 50%

Las cosas que "veo" y no termino de entender son:

1.- Si en las 3 opciones hay 2 table scan al 50% , porque la primera
es mejor que las otras 2 ?
2.- Que es Nested Loops ? y cuales son las diferencias entre Left Anti
Semi Join - Left Semi Join y Left Outer Join
3.- En el costo de la consulta (en relacion al proceso por lotes) los
valores son:
1.- 33.35
2.- 33.29
3.- 33.36
Aca puedo apreciar que la 2da demora menos ?? Esto lo entiendo
menos.

Muchas Gracias.
Penta.
Respuesta Responder a este mensaje
#9 Alejandro Mesa
12/02/2008 - 19:42 | Informe spam
Penta,

Primero debes usar tablas con indices apropiados para esta consulta y cargar
una cantidad significante de data.

1.- Si en las 3 opciones hay 2 table scan al 50% , porque la primera
es mejor que las otras 2 ?



La mejor va a depender de tu ambiente y de las pruebas que tu hagas.

2.- Que es Nested Loops ? y cuales son las diferencias entre Left Anti
Semi Join - Left Semi Join y Left Outer Join



Eso lo puedes leer en los libros en linea.

Trata de hacer otra prueba con mas data, y si es posible indices clustered y
no clustered.


AMB




"Penta" wrote:

Estimado Alejandro.
Con estas 3 querys obtengo el resultado deseado:

1.-

SELECT *
FROM tabla1 AS a
WHERE NOT EXISTS (
SELECT *
FROM tabla2 AS b
WHERE b.c1 = a.c1
)


2.-
SELECT *
FROM tabla1
WHERE c1 NOT IN (SELECT c1 FROM tabla2 where c1 is not null)
or c1 is null

3.-
select t1.c1
from tabla1 t1
left join tabla2 t2 on
t1.c1=t2.c1
where t2.c1 is null

Planes de Ejecucion (ojala me puedas ayudar ya que NO los entiendo)

1.-
Select Costo 0% - Nested Loops/Left Anti Semi Join Costo 0%- Table
Scan 50% - Table Scan 50%

2.-
Select Costo 0% - Filter 0% - Nested Loops/Left Semi Join Costo 0%-
Table Scan 50% - Row Count Spool/Lazy Spool 0 % - Table Scan 50%

3.-
Select Costo 0% - Filter 0% - Nested Loops/Left Outer Join Costo 0%-
Table Scan 50% - Table Scan 50%

Las cosas que "veo" y no termino de entender son:

1.- Si en las 3 opciones hay 2 table scan al 50% , porque la primera
es mejor que las otras 2 ?
2.- Que es Nested Loops ? y cuales son las diferencias entre Left Anti
Semi Join - Left Semi Join y Left Outer Join
3.- En el costo de la consulta (en relacion al proceso por lotes) los
valores son:
1.- 33.35
2.- 33.29
3.- 33.36
Aca puedo apreciar que la 2da demora menos ?? Esto lo entiendo
menos.

Muchas Gracias.
Penta.






Respuesta Responder a este mensaje
#10 Penta
12/02/2008 - 20:38 | Informe spam
Estimado Alejandro.
Serías tan amable de pasarme el Link de los libros en linea ? ya que
la ayuda que tengo lisbros en pantalla de SQL Server No tiene
informacion sobre:

Left Anti Semi Join
Left Semi Join

Muchas gracias de nuevo.
Penta.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida