获取与查询不匹配的已连接行

时间:2012-06-19 15:41:41

标签: sql

我有一个可以申请实习的实习生申请表。 我们有一个自动限定实习生资格的脚本。 我想找一些没有资格参加任何实习的实习生。

数据库是这样的:

 Intern (Id,...)
 Application (Id, status, intern_id, internship_id,...)
 Internship (Id,...)

对于状态,我们已经'申请','合格','当前'和'完成' 基本上我需要对没有具有“合格”状态的应用程序的实习生进行加入请求,但我的SQL技能非常基础。

修改

我忘了提到实习生可以有几个申请,实习生只能申请一次实习,但他仍然可以申请另一个,所以这不会有效

SELECT *
FROM Intern i
INNER JOIN Application a ON i.Id = a.intern_id
WHERE a.status <> 'qualified'

4 个答案:

答案 0 :(得分:1)

SELECT *
  FROM Intern i
 WHERE NOT EXISTS
    (SELECT *
       FROM Intern j
          , Application a
      WHERE j.id = a.intern_id
        AND i.id = j.id
        AND a.status = 'qualified')

答案 1 :(得分:1)

将状态包含在LEFT JOIN中,并过滤非匹配项,如下所示:

SELECT  ....
FROM    Intern i
        LEFT JOIN
                Application a
                ON i.Id = a.intern_id
                AND a.status = 'qualified'
WHERE   a.Id IS NULL

显然替换你的列列表!

答案 2 :(得分:0)

SELECT * FROM Intern
WHERE Id IN ( SELECT Intern_id FROM Application WHERE status <> 'qualified' );

答案 3 :(得分:0)

此查询应返回您要查找的内容:

SELECT *
FROM Intern i
INNER JOIN Application a ON i.Id = a.intern_id
WHERE a.status <> 'qualified'

显然,您可以仅使用您要查找的字段替换*。如果您正在寻找没有资格的实习生,我认为您不需要实习表。这假设每个实习生只有一个应用程序...如果不是这样,你可以使用这个查询:

SELECT *
FROM Intern i
WHERE i.Id IN
(
 SELECT intern_id
 FROM Application a
 WHERE a.status <> 'qualified'
)