[Code] Cómo consultar los registros no asociados con otros registros de la misma tabla

 Detectar si un determinado usuario tiene o no autorización para realizar alguna tarea, detectar cuales de los ítems no ha sido asociados a él es tan solo algunas de las aplicaciones para éste artículo.

Como primera instancia tenemos una tabla de ejemplo, que se genera usando:

declare @t1 table (id int, VALOR CHAR(1))

 

insert into

@t1 values (1, ‘A’)
insert into @t1 values (2, ‘B’)
insert into @t1 values (3, ‘C’)
insert into @t1 values (4, ‘D’)
insert into @t1 values (5, ‘E’)

select

* from @t1

id VALOR
1 A
2 B
3 C
4 D
5 E

Queremos saber por cada uno de los valores en la columna Id, cuales de los valores en la columna VALOR no están asociados con un Id

Es decir que para el Id 1, los valores deben ser B,C,D,E

La primera aproximación para saber cual de los VALORES está aplicado a cada uno de los Id es realizar un Cross Join

SELECT

* from @t1 t1 cross join @t1 t2

id VALOR id VALOR
1 A 1 A
2 B 1 A
3 C 1 A
4 D 1 A
5 E 1 A
1 A 2 B
2 B 2 B
3 C 2 B
4 D 2 B
5 E 2 B
1 A 3 C
2 B 3 C
3 C 3 C
4 D 3 C
5 E 3 C
1 A 4 D
2 B 4 D
3 C 4 D
4 D 4 D
5 E 4 D
1 A 5 E
2 B 5 E
3 C 5 E
4 D 5 E
5 E 5 E

Se nota en ésta combinación que 1 ya está asociado con A en la fila         y notamos que en las columnas         vemos que los valos con 1 no están asociados

Por lo que si creamos un condición podemos eliminar los que ya están asociados dejando solo los que NO están asociados

SELECT t2.id, t1.VALOR from @t1 t1 cross join @t1 t2 where not (t1.id = t2.id and t2.VALOR = t2.VALOR )

id VALOR
1 B
1 C
1 D
1 E
2 A
2 C
2 D
2 E
3 A
3 B
3 D
3 E
4 A
4 B
4 C
4 E
5 A
5 B
5 C
5 D

 

 

Espero sea de ayuda

 

FREDY LEANDRO ANGARITA CASTELLANOS
Sql Server MVP

Un comentario en “[Code] Cómo consultar los registros no asociados con otros registros de la misma tabla”

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *