Hola,
Quiero aprovechar este espacio para divulgar sobre "Microsoft Connect".
Microsoft Connect es un sitio donde los usuarios de los productos de
Microsoft podemos aprender y contribuir a que Microsoft mejore sus productos
y servicios, atraves de nuestras sugerencias, intercambio de ideas,
questionarios, etc.
Por que hago esta introducción?
Ahi voy, espero no aburrirlos. Resulta que en el grupo privado de MVPs de
SQL Server, estuvimos comentando sobre algunas de las nuevas facilidades de
T-SQL, que vienen con SQL Server 2008, entre ellas la sentencia MERGE. Esta
sentencia nos permite, entre otras cosas, comparar dos conjuntos, fuente y
destino, y en dependencia de la expresion usada para machar las filas,
podemos insertar las filas de la fuente que no estan en el destino o
actualizar las filas que estan en ambos conjuntos o tablas. La expresion de
union o busqueda, entre ambos conjuntos, no tiene que ser necesariamente la
clave primaria, por lo que pueden participar columnas que aceptan valor NULL.
Cuando comparamos columnas que aceptan valor NULL, debemos tener en cuenta
que la expresion puede dar como resultado 3 valores (TRUE, FALSE y UNKNOWN),
por lo que la expresion a usar se hace un poco rara, diria yo. Veamos un
ejemplo de este tipo de expresiones:
declare @t1 table (c1 int)
declare @t2 table (c1 int)
insert into @t1 values(1)
insert into @t1 values(2)
insert into @t1 values(NULL)
insert into @t2 values(NULL)
insert into @t2 values(2)
insert into @t2 values(3)
select
a.*,
b.*
from
@t1 as a
inner join
@t1 as b
on a.c1 = b.c1
or (a.c1 is null and b.c1 is null)
select
a.*,
b.*
from
@t1 as a
inner join
@t1 as b
on a.c1 != b.c1
or (a.c1 is null and b.c1 is not null)
or (a.c1 is not null and b.c1 is null)
go
Como podemos apreciar, la expresion logica, usada para la union, debe
considerar los valores NULL y por ende, esta se hace un poquitico mas
complicada, pero ademas, el optimizador de consultas debe esforzarce mas para
seleccionar un plan de ejecución y no siempre escoje el deseado.
Uno de los miembros del grupo, Steve Kass, hizo una busqueda y encontro que
ANSI SQL tiene la respuesta a este tema mediante el uso del operador:
IS [NOT] DISTINCT FROM
No es un operador muy estetico que digamos, pero nos ayuda a que este tipo
de expresiones se hagan mas legibles y hasta ayudaria al optimizador de
consultas en su busqueda por un plan de execución optimo. Como quedarian las
expresiones anteriores si usamos este operador?
on a.c1 = b.c1 or (a.c1 is null and b.c1 is null)
quedaria como:
on a.c1 IS NOT DISTINCT FROM b.c1
y la expresion:
on a.c1 != b.c1
or (a.c1 is null and b.c1 is not null)
or (a.c1 is not null and b.c1 is null)
quedaria como:
on a.c1 IS DISTINCT FROM b.c1
Creo que no hace falta mucha explicación para darnos cuenta de la ayuda que
este operador nos brindará, si Microsoft lo introduce en el arsenal de T-SQL.
Como podemos nosotros ayudar a que este tipo de sugerencias se tome en
cuenta por Microsoft?
Votando en "Microsoft Connect", y es aqui donde acudo a ustedes, los
desarrolladores de cada dia, a que pongan un granito para mejorar SQL Server.
Les paso un link a un articulo / blog escrito por el maestro Itzik Ben-Gan,
sobre este mismo tema (esta en Ingles) y tambien el link donde pueden leer
sobre la sugerencia hecha por Steve Kass a Microsoft y donde pueden votar.
Para votar, necesitan un ID de "Windows Live" o "Microsoft Passport" (todo el
que tenga una cuenta econ MSN debe ya tenerlo), y cuando esten en la
sugerencia, pasan el cursor por las estrellas que aparecen bajo "Rating" y
escogen que estrella pinchar.
Blog de Itzik Ben-Gan
IS NOT DISTINCT FROM
http://www.sqlmag.com/Articles/Index.cfm?ArticleID563&DisplayTab=Article
Sugerencia hecha por Steve Kass
Add language and optimizer support for ISO <distinct predicate>
https://connect.microsoft.com/SQLSe...FeedbackID(6422
Muchas gracías por tu tiempo, por leer este post y por la ayuda que nos
puedas brindar para mejorar SQL Server.
Saludos,
Alejandro Mesa
Leer las respuestas