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
Agenda MVP (12 de septiembre – 18 de septiembre) Artículos Cómo consultar los registros no asociados