如何避免在以下查询中使用NOT IN和SUBSELECT

时间:2016-02-02 17:58:14

标签: sql sql-server

如何避免在此查询中使用NOT IN子选项并避免使用子选择

select idTipoDocumento,idDocumentoTarea
from ArchivosTarea as a 
inner join Tarea as b on a.idEstadoTarea=b.idTarea
where b.idTarea = 160 
and idDocumentoTarea not in (select idDocumentoTarea

from ArchivosTarea as a 
inner join tiposArchivos as b on a.idTipoDocumento = b.idTipoArchivo 
inner join documentoSolicitud as c on b.idTipoArchivo = c.Id_tipo_archivo
inner join tarea as d on a.idEstadoTarea=d.idTarea
where d.idTarea = 160)

我知道可能LEFT JOIN或类似的东西应该可以解决这个问题,但我已经尝试过了,它并没有提供与此查询相同的结果。

实际的想法是避免使用SUBSELECT(WHERE)并避免使用NOT IN。

2 个答案:

答案 0 :(得分:1)

使用左连接:

Select A.idTipoDocumento,A.idDocumentoTarea from
(select idTipoDocumento,idDocumentoTarea
from ArchivosTarea as a 
inner join Tarea as b on a.idEstadoTarea=b.idTarea
where b.idTarea = 160)A
left outer join
(select idDocumentoTarea from ArchivosTarea as a 
inner join tiposArchivos as b on a.idTipoDocumento = b.idTipoArchivo 
inner join documentoSolicitud as c on b.idTipoArchivo = c.Id_tipo_archivo
inner join tarea as d on a.idEstadoTarea=d.idTarea
where d.idTarea = 160)B
on A.idDocumentoTarea=B.idDocumentoTarea
where B.idDocumentoTarea is null

答案 1 :(得分:0)

碰巧SQL Server有反连接又名semiminus又名EXCEPTION JOIN。它返回左边参数中的行,当右边连接时不匹配。

select idTipoDocumento,idDocumentoTarea
from ArchivosTarea as a 
inner join Tarea as b on a.idEstadoTarea=b.idTarea
and b.idTarea = 160 
exception join (
    select idDocumentoTarea
    from ArchivosTarea as a 
    inner join tiposArchivos as b on a.idTipoDocumento = b.idTipoArchivo 
    inner join documentoSolicitud as c on b.idTipoArchivo = c.Id_tipo_archivo
    inner join tarea as d on a.idEstadoTarea=d.idTarea
    where d.idTarea = 160)

可以使用LEFT JOIN执行此操作。也使用NOT EXISTS。