所有NOT IN都可以转换为NOT EXISTS?

时间:2014-07-13 09:13:12

标签: sql not-exists

我有一个表,FilesContainsFiles是一个连接表:

  • FilesContainsFiles(IDContainerFile,IDContentFile)

我想知道哪些包含的文件只包含在特定的容器文件中。

例如,我有包含file01和file02的fileA以及包含file01的fileB。

我想知道哪些文件只包含在fileA中。所以有了NOT IN我有:

select * from FilesContainsFiles 
where IDContentFile NOT IN(
select IDContentFile from FilesContainsFiles 
where IDContentFile IN(select IDContentFile 
from FilesContainsFiles where IDContainerFile NOT IN (64)))

注意:我使用的是NOT IN和IN,因为我想特定一个很多的fileContainer。对于一个容器,我可以使用相同的比较。

但是,当我尝试使用NOT EXISTS并且我没有得到结果时。我尝试这样的事情:

select * from FilesContainsFiles 
where NOT EXISTS(select * from FilesContainsFiles where IDContainerFile <> 64)

是否可以使用NOT EXISTS代替NOT IN?

感谢。

2 个答案:

答案 0 :(得分:2)

我认为您的IN查询可以写成

select * from FilesContainsFiles 
where IDContentFile NOT IN(select IDContentFile 
from FilesContainsFiles where IDContainerFile <> 64)

EXISTS版本为

select * from FilesContainsFiles fcf
where NOT EXISTS (select * from 
FilesContainsFiles fcf2
where IDContainerFile <> 64
and fcf.IDContentFile = fcf2.IDContentFile)

答案 1 :(得分:2)

您也可以尝试这样做以实现相同的目标(仅选择ID = 64的容器中包含的内容文件):

SELECT IDContentFile, GROUP_CONCAT(IDContainerFile) AS IDContainers 
FROM FilesContainsFiles
GROUP BY IDContentFile
HAVING IDContainers = "64";