如何在嵌套的SQL SELECT查询中链接两个值?

时间:2011-04-27 08:49:44

标签: sql sql-server database

我有一个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

4 个答案:

答案 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
    )
相关问题