Que diferencia hay al hacer un query entre usar un MINUS o un Not IN???

30/12/2003 - 16:54 por anonymous | Informe spam
Que diferencia hay al hacer un query entre usar un MINUS
o un Not IN.
NO VENDRÍA A SER LO MISMO (Es decir NO me devuelven los
mismo datos???)
Me podrían dar ejemplos con las diferencias

Preguntas similare

Leer las respuestas

#6 Gustavo Larriera [MVP]
30/12/2003 - 19:32 | Informe spam
Estas dos sentencias SELECT, una con IN y otra con EXISTS son semánticamente
equivalentes (en sus resultados finales) y además sus planes de ejecución
son los mismos. Ver Query 1 y 2.

Pero si ambas queries usan NOT (NOT IN y NOT EXISTS) se generan planes de
ejecucion bien distintos. Ver Query 1b y 2b


SET SHOWPLAN_TEXT ON
GO
USE pubs
GO
SELECT distinct pub_name
FROM publishers
WHERE pub_id IN
(SELECT pub_id
FROM titles
WHERE type = 'business')
GO

StmtText
-

|--Sort(DISTINCT ORDER BY:([publishers].[pub_name] ASC))
|--Nested Loops(Inner Join, OUTER REFERENCES:([titles].[pub_id]))
|--Sort(DISTINCT ORDER BY:([titles].[pub_id] ASC))
| |--Clustered Index
Scan(OBJECT:([pubs].[dbo].[titles].[UPKCL_titleidind]),
WHERE:([titles].[type]='business'))
|--Clustered Index
Seek(OBJECT:([pubs].[dbo].[publishers].[UPKCL_pubind]),
SEEK:([publishers].[pub_id]=[titles].[pub_id]) ORDERED FORWARD)


SET SHOWPLAN_TEXT ON
GO
USE pubs
GO
SELECT DISTINCT pub_name
FROM publishers
WHERE EXISTS
(SELECT *
FROM titles
WHERE pub_id = publishers.pub_id
AND type = 'business')
GO

StmtText
-

|--Sort(DISTINCT ORDER BY:([publishers].[pub_name] ASC))
|--Nested Loops(Inner Join, OUTER REFERENCES:([titles].[pub_id]))
|--Sort(DISTINCT ORDER BY:([titles].[pub_id] ASC))
| |--Clustered Index
Scan(OBJECT:([pubs].[dbo].[titles].[UPKCL_titleidind]),
WHERE:([titles].[type]='business'))
|--Clustered Index
Seek(OBJECT:([pubs].[dbo].[publishers].[UPKCL_pubind]),
SEEK:([publishers].[pub_id]=[titles].[pub_id]) ORDERED FORWARD)


SET SHOWPLAN_TEXT ON
GO
USE pubs
GO
SELECT distinct pub_name
FROM publishers
WHERE pub_id NOT IN
(SELECT pub_id
FROM titles
WHERE type = 'business')
GO

StmtText
-
|--Sort(DISTINCT ORDER BY:([publishers].[pub_name] ASC))
|--Nested Loops(Left Anti Semi Join, WHERE:([titles].[pub_id]=NULL OR
[publishers].[pub_id]=[titles].[pub_id]))
|--Clustered Index
Scan(OBJECT:([pubs].[dbo].[publishers].[UPKCL_pubind]))
|--Clustered Index
Scan(OBJECT:([pubs].[dbo].[titles].[UPKCL_titleidind]),
WHERE:([titles].[type]='business'))


SET SHOWPLAN_TEXT ON
GO
USE pubs
GO
SELECT DISTINCT pub_name
FROM publishers
WHERE NOT EXISTS
(SELECT *
FROM titles
WHERE pub_id = publishers.pub_id
AND type = 'business')
GO

StmtText
-
-
|--Sort(DISTINCT ORDER BY:([publishers].[pub_name] ASC))
|--Nested Loops(Left Anti Semi Join, OUTER
REFERENCES:([publishers].[pub_id]))
|--Clustered Index
Scan(OBJECT:([pubs].[dbo].[publishers].[UPKCL_pubind]))
|--Top(1)
|--Clustered Index
Scan(OBJECT:([pubs].[dbo].[titles].[UPKCL_titleidind]),
WHERE:([titles].[pub_id]=[publishers].[pub_id] AND
[titles].[type]='business'))


Gustavo Larriera, MSFT MVP-SQL
Uruguay LatAm

This message is provided "AS IS" with no warranties expressed or implied,
and confers no rights.


"ulises" wrote in message
news:004201c3cefa$424f3960$
A riesgo de equivocarme, creo que la opción MINUS (como en
Oracle) no está implementada como tal en SQL Server y
puede ser reemplazada por la sentencia NOT EXISTS, se
podría probar con las siguientes sentencias que deben dar
el mismo resultado:

SELECT DISTINCT city
FROM authors
WHERE NOT EXISTS
(SELECT *
FROM publishers
WHERE authors.city = publishers.city)


SELECT distinct city
FROM authors a
where city NOT IN ( select city from publishers where city
= a.city )

¿a eso te refieres?, según el Plan de ejecución de cada una
de ellas la sentencia con EXISTS utiliza una tabla
temporal para almacenar datos intermedios, pero en general
el tiempo de respuesta es similar con los datos que se
tiene, habría que probar con mayor cantidad de información.

Saludos,
Ulises

Que diferencia hay al hacer un query entre usar un MINUS
o un Not IN.
NO VENDRÍA A SER LO MISMO (Es decir NO me devuelven los
mismo datos???)
Me podrían dar ejemplos con las diferencias
Respuesta Responder a este mensaje
#7 Gustavo Larriera [MVP]
30/12/2003 - 19:50 | Informe spam
Yo entiendo que el MINUS es el operador de "diferencia entre conjuntos",
como se lo menciona en el álgebra relacional. Bajo esa hipótesis, tenemos
que SQL Server no implementa el MINUS aunque puede hacerse con subqueries
basadas en NOT EXISTS como Ulises menciona en otro mensaje.

Oracle dispone de palabras UNION, MINUS e INTERSECT para hacer las
operaciones de conjuntos: Union, Diferencia e Intersección.

SQL Server implementa UNION. Las otras dos operaciones se pueden hacer
basadas en subqueries con un esfuercito adicional.

Muchisimos saludos
gux

Gustavo Larriera, MSFT MVP-SQL
Uruguay LatAm

This message is provided "AS IS" with no warranties expressed or implied,
and confers no rights.


"Maximiliano Damian Accotto" <maxi_accotto[arroba]speedy.com.ar.SACAME>
wrote in message news:%231Wnw$
me parece si no entendi mal que del minus que habla es de <,

pero ahora que decis eso me queda la duda :S

salu2

Maximiliano Damian Accotto


"Gustavo Larriera [MVP]" escribió en


el
mensaje news:
> MINUS está implementado en T-SQL ?
>
> Gustavo Larriera, MSFT MVP-SQL
> Uruguay LatAm
>
> This message is provided "AS IS" with no warranties expressed or


implied,
> and confers no rights.
>
>
> "anonymous" wrote in message
> news:00a201c3ceed$467b1bb0$
> Que diferencia hay al hacer un query entre usar un MINUS
> o un Not IN.
> NO VENDRÍA A SER LO MISMO (Es decir NO me devuelven los
> mismo datos???)
> Me podrían dar ejemplos con las diferencias
>
>


Respuesta Responder a este mensaje
#8 Maximiliano Damian Accotto
30/12/2003 - 19:56 | Informe spam
ahora Gux es recomendable usar subconsultas? , claro si no hay otra opcion
por el momento.

Salu2


Maximiliano Damian Accotto


"Gustavo Larriera [MVP]" escribió en el
mensaje news:
Yo entiendo que el MINUS es el operador de "diferencia entre conjuntos",
como se lo menciona en el álgebra relacional. Bajo esa hipótesis, tenemos
que SQL Server no implementa el MINUS aunque puede hacerse con subqueries
basadas en NOT EXISTS como Ulises menciona en otro mensaje.

Oracle dispone de palabras UNION, MINUS e INTERSECT para hacer las
operaciones de conjuntos: Union, Diferencia e Intersección.

SQL Server implementa UNION. Las otras dos operaciones se pueden hacer
basadas en subqueries con un esfuercito adicional.

Muchisimos saludos
gux

Gustavo Larriera, MSFT MVP-SQL
Uruguay LatAm

This message is provided "AS IS" with no warranties expressed or implied,
and confers no rights.


"Maximiliano Damian Accotto" <maxi_accotto[arroba]speedy.com.ar.SACAME>
wrote in message news:%231Wnw$
> me parece si no entendi mal que del minus que habla es de <,
>
> pero ahora que decis eso me queda la duda :S
>
> salu2
>
> Maximiliano Damian Accotto
>
>
> "Gustavo Larriera [MVP]" escribió en
el
> mensaje news:
> > MINUS está implementado en T-SQL ?
> >
> > Gustavo Larriera, MSFT MVP-SQL
> > Uruguay LatAm
> >
> > This message is provided "AS IS" with no warranties expressed or
implied,
> > and confers no rights.
> >
> >
> > "anonymous" wrote in message
> > news:00a201c3ceed$467b1bb0$
> > Que diferencia hay al hacer un query entre usar un MINUS
> > o un Not IN.
> > NO VENDRÍA A SER LO MISMO (Es decir NO me devuelven los
> > mismo datos???)
> > Me podrían dar ejemplos con las diferencias
> >
> >
>
>


Respuesta Responder a este mensaje
#9 Gustavo Larriera [MVP]
30/12/2003 - 20:13 | Informe spam
Los dialectos SQL que directamente implementan palabras como MINUS, UNION,
INTERSECTS, etc. pueden considerarse como "más relacionales". Pero si las
mismas operaciones pueden escribirse con otros mecanismos (por ejemplo,
subqueries) entonces también resolvemos el problema. Por supuesto, la
eficiencia recaerá en los optimizadores de consultas.

Es por eso que en otro mensaje yo mostraba que 2 consultas que hacian lo
mismo, una usando IN y otra usando EXISTS, el optimizador de consultas de
SQL Server generaba el mismo plan. Pero no así cuando se negaban las
condiciones (NOT IN y NOT EXISTS).

En un mundo ideal, la forma de escribir la consulta deberia ser bastante
independiente de su nivel de optimización... pero ya sabemos que el mundo no
es tan perfecto :-)

Muchisimos saludos
gux
Gustavo Larriera, MSFT MVP-SQL
Uruguay LatAm

This message is provided "AS IS" with no warranties expressed or implied,
and confers no rights.


"Maximiliano Damian Accotto" <maxi_accotto[arroba]speedy.com.ar.SACAME>
wrote in message news:
ahora Gux es recomendable usar subconsultas? , claro si no hay otra opcion
por el momento.

Salu2


Maximiliano Damian Accotto


"Gustavo Larriera [MVP]" escribió en


el
mensaje news:
> Yo entiendo que el MINUS es el operador de "diferencia entre conjuntos",
> como se lo menciona en el álgebra relacional. Bajo esa hipótesis,


tenemos
> que SQL Server no implementa el MINUS aunque puede hacerse con


subqueries
> basadas en NOT EXISTS como Ulises menciona en otro mensaje.
>
> Oracle dispone de palabras UNION, MINUS e INTERSECT para hacer las
> operaciones de conjuntos: Union, Diferencia e Intersección.
>
> SQL Server implementa UNION. Las otras dos operaciones se pueden hacer
> basadas en subqueries con un esfuercito adicional.
>
> Muchisimos saludos
> gux
>
> Gustavo Larriera, MSFT MVP-SQL
> Uruguay LatAm
>
> This message is provided "AS IS" with no warranties expressed or


implied,
> and confers no rights.
>
>
> "Maximiliano Damian Accotto" <maxi_accotto[arroba]speedy.com.ar.SACAME>
> wrote in message news:%231Wnw$
> > me parece si no entendi mal que del minus que habla es de <,
> >
> > pero ahora que decis eso me queda la duda :S
> >
> > salu2
> >
> > Maximiliano Damian Accotto
> >
> >
> > "Gustavo Larriera [MVP]" escribió


en
> el
> > mensaje news:
> > > MINUS está implementado en T-SQL ?
> > >
> > > Gustavo Larriera, MSFT MVP-SQL
> > > Uruguay LatAm
> > >
> > > This message is provided "AS IS" with no warranties expressed or
> implied,
> > > and confers no rights.
> > >
> > >
> > > "anonymous" wrote in message
> > > news:00a201c3ceed$467b1bb0$
> > > Que diferencia hay al hacer un query entre usar un MINUS
> > > o un Not IN.
> > > NO VENDRÍA A SER LO MISMO (Es decir NO me devuelven los
> > > mismo datos???)
> > > Me podrían dar ejemplos con las diferencias
> > >
> > >
> >
> >
>
>


Respuesta Responder a este mensaje
#10 ulises
30/12/2003 - 22:03 | Informe spam
Hola Gux,

Relacionado con este tema, sabrás por casualidad de donde
bajar el documento que contiene el estandar ANSI SQL 99,
no lo ubico en la red y lo necesito para hacer algunas
verificaciones.

Saludos,
Ulises

Yo entiendo que el MINUS es el operador de "diferencia


entre conjuntos",
como se lo menciona en el álgebra relacional. Bajo esa


hipótesis, tenemos
que SQL Server no implementa el MINUS aunque puede


hacerse con subqueries
basadas en NOT EXISTS como Ulises menciona en otro


mensaje.

Oracle dispone de palabras UNION, MINUS e INTERSECT para


hacer las
operaciones de conjuntos: Union, Diferencia e


Intersección.

SQL Server implementa UNION. Las otras dos operaciones se


pueden hacer
basadas en subqueries con un esfuercito adicional.

Muchisimos saludos
gux

Gustavo Larriera, MSFT MVP-SQL
Uruguay LatAm

This message is provided "AS IS" with no warranties


expressed or implied,
and confers no rights.


"Maximiliano Damian Accotto" <maxi_accotto[arroba]


speedy.com.ar.SACAME>
wrote in message news:%


231Wnw$
me parece si no entendi mal que del minus que habla es




de <,

pero ahora que decis eso me queda la duda :S

salu2

Maximiliano Damian Accotto


"Gustavo Larriera [MVP]"




escribió en
el
mensaje news:
> MINUS está implementado en T-SQL ?
>
> Gustavo Larriera, MSFT MVP-SQL
> Uruguay LatAm
>
> This message is provided "AS IS" with no warranties




expressed or
implied,
> and confers no rights.
>
>
> "anonymous"




wrote in message
> news:00a201c3ceed$467b1bb0$
> Que diferencia hay al hacer un query entre usar un




MINUS
> o un Not IN.
> NO VENDRÍA A SER LO MISMO (Es decir NO me devuelven




los
> mismo datos???)
> Me podrían dar ejemplos con las diferencias
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida