[英]How do I link two values in a nested SQL SELECT query?
我有一个 SQL 服务器表 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);
以上我相信会起作用,但我有一个问题,即如何将 map ThatSameFileId
到从外部SELECT
返回的FileId
上,以便数据库知道这些是相同的。
我怎么做? 如何告诉数据库外部SELECT
中的FileId
必须等于内部SELECT
中的FileId
?
使用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
我在这里采用了另一种方法,但如果我正确理解了您的问题,它将产生您需要的结果。
它的要点是这样的
JobId
中获取所有FileId's
JOIN
JobFiles
表HAVING
子句仅保留那些没有其他JobId
的FileId's
。SQL 声明
SELECT jf1.FileId
FROM JobFiles jf1
INNER JOIN (
SELECT FileId
FROM JobFiles
WHERE JobID = JobIdICareAbout
) jf2 ON jf2.FileID = jf1.FileID
GROUP BY
jf1.FileId
HAVING COUNT(*) = 1
另一种方法:
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
似乎您有很多(不同但)有效的答案/查询。 这是另一个使用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
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.