2014-07-13 29 views
1

我有一個表,FilesContainsFiles這是一個連接表:所有NOT IN都可以轉換爲NOT EXISTS嗎?

  • FilesContainsFiles(IDContainerFile,IDContentFile)

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

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

我想知道哪些文件只包含在fileA中。所以與不在我有:

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

我覺得你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

非常感謝。 NOT IN版本比我的版本更簡單,不存在的版本可以正常工作。謝謝。 –

2

你也可以試試這個來達到同樣的目標(只能選擇其中包含的內容文件在ID = 64的容器中):

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

這是僅限於mysql(由於'group_concat'和在'having'中使用表達式別名)。 – GSerg

相關問題