我有一个SQL Server表JobFiles,其中包含JobId和FileId列。此表映射哪个文件属于哪个作业。每个作业可以“包含”一个或多个文件,并且每个文件可以“包含”在一个或多个作业中。对于每一对,使得作业M包含文件N,表中有一行(M,N)。
我从作业ID开始,我需要获取所有文件的列表,使它们只属于该作业。我很难写出一个请求。到目前为止,我已经制作了以下(伪代码):
SELECT FileId FROM JobFiles WHERE JobId=JobIdICareAbout AND NOT EXISTS
(SELECT * FROM JobFiles WHERE FileId=ThatSameFileId AND JobId<>JobIdICareAbout);
以上我认为可行,但我有一个问题,即如何将ThatSameFileId
映射到从外FileId
返回的SELECT
,以便数据库知道它们是相同的。
我该怎么做?如何告诉数据库外部FileId
中的SELECT
必须等于内部FileId
中的SELECT
?
答案 0 :(得分:3)
如何使用NOT IN
:
SELECT FileId FROM JobFiles WHERE JobId=JobIdICareAbout AND FileID NOT IN
(SELECT FileId FROM JobFiles WHERE JobId<>JobIdICareAbout);
略有不同:
SELECT FileId FROM JobFiles WHERE JobId=JobIdICareAbout
EXCEPT
SELECT FileId FROM JobFiles WHERE JobId<>JobIdICareAbout
答案 1 :(得分:3)
我在这里采取另一种方法,但如果我正确理解你的问题,它会产生你需要的结果。
它的主旨是这样的
FileId's
获取所有JobId
JOIN
返回JobFiles
tabel FileId's
条款保留那些没有其他JobId
的{{1}}。SQL声明
HAVING
答案 2 :(得分:2)
另一种方法:
LEFT JOIN
只会在此文件链接到其他作业时找到行,检查IS NULL
会删除这些文件:
SELECT JobFiles.FileId
FROM JobFiles
LEFT JOIN JobFiles OtherJobFiles ON ( OtherJobFiles.FileId = JobFiles.FileId
AND OtherJobFiles.JobId <> JobIdICareAbout )
WHERE JobFiles.JobId=JobIdICareAbout
AND OtherJobFiles.FileId IS NULL
答案 3 :(得分:2)
似乎你有很多(不同但是)工作的答案/查询。还有一个使用NOT EXISTS
。这只是对你所尝试的内容的纠正:
SELECT jf.FileId
FROM JobFiles jf
WHERE jf.JobId = JobIdICareAbout
AND NOT EXISTS
( SELECT 1
FROM JobFiles jf2
WHERE jf2.FileId = jf.FileId
AND jf2.JobId <> JobIdICareAbout
)