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

Mostrar la cita
#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$
Mostrar la cita
el
Mostrar la cita
implied,
Mostrar la cita
#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:
Mostrar la cita
#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:
Mostrar la cita
el
Mostrar la cita
tenemos
Mostrar la cita
subqueries
Mostrar la cita
implied,
Mostrar la cita
en
Mostrar la cita
#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

Mostrar la cita
entre conjuntos",
Mostrar la cita
hipótesis, tenemos
Mostrar la cita
hacerse con subqueries
Mostrar la cita
mensaje.
Mostrar la cita
hacer las
Mostrar la cita
Intersección.
Mostrar la cita
pueden hacer
Mostrar la cita
expressed or implied,
Mostrar la cita
speedy.com.ar.SACAME>
Mostrar la cita
231Wnw$
Mostrar la cita
de <,
Mostrar la cita
escribió en
Mostrar la cita
expressed or
Mostrar la cita
wrote in message
Mostrar la cita
MINUS
Mostrar la cita
los
Mostrar la cita
Ads by Google
Search Busqueda sugerida