簡體   English   中英

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

[英]How can I avoid using the NOT IN and the SUBSELECT in the following query

如何避免在此查詢中使用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或類似的方法可以解決這個問題,但是我已經嘗試過了,但是它不能為我提供與該查詢相同的結果。

實際的想法是避免(在WHERE的)SUBSELECT,同時也避免使用NOT IN。

使用左聯接:

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

碰巧SQL Server具有antijoin(又稱半減)又稱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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM