我有一个表,FilesContainsFiles是一个连接表:
我想知道哪些包含的文件只包含在特定的容器文件中。
例如,我有包含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?
感谢。
答案 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";