SQL 语句 - 排除某些数据

Posted

技术标签:

【中文标题】SQL 语句 - 排除某些数据【英文标题】:SQL Statement - Excluding certain data 【发布时间】:2013-07-07 18:31:52 【问题描述】:

我仍处于 SQL 语句的学习阶段,希望有人能提供帮助。

我有一个多对多的数据库基础关系。

表 Department 可以有多个与之关联的 Jobs,并且 Jobs 可以与多个 Departments 相关联。所以我有这种基本的关系类型。

Job.ID (one-to-many) Jobs.JobID
Jobs.DepartmentID (many-to-one) Department.ID

我要做的是获取尚未与部门关联的工作列表。

tbl=Job
ID  Job     Active
1   10-3242  Yes
2   12-3902  Yes
3   12-3898  Yes

tbl=Jobs
ID  DepartmentID    JobID
1        3            1
2        3            2

tbl=Department
ID  Department
1   Administration
2   Sales
3   Production

查询:

string sql = "SELECT Job FROM (Job " +
    "INNER JOIN Jobs ON Job.ID = Jobs.JobID) " +
    "INNER JOIN Department ON Jobs.DepartmentID = Department.ID " +
    "WHERE Department.Department <> 'Production'";

我希望返回工作代码12-3898,但显然我忘记了一些事情。

任何帮助都会很棒。 干杯。

【问题讨论】:

【参考方案1】:

您可以使用LEFT JOINLEFT JOIN 关键字返回左表中的所有行以及右表中的匹配行。如果没有匹配,结果是右侧的NULL。由于您想要没有匹配部门的职位,您可以检查加入的DepartmentID是否为NULL

SELECT Job.Job
FROM   Job LEFT JOIN Jobs ON Job.ID = Jobs.JobID
WHERE  Jobs.DepartmentID IS NULL;

结帐this demo。让我知道它是否有效。

【讨论】:

【参考方案2】:
select  job
from    job
where   id not in   (select jobId
                    from    jobs)

【讨论】:

感谢 Nikita,我刚刚尝试过这种方法,它也有效。谢谢。【参考方案3】:

很遗憾,我不在一个可以测试结果的环境中。然而,这背后的基本思考过程是,每当您想从一个表中返回没有来自另一个表的匹配行的行时,您必须进行外连接。目的是要显示作业表中的所有行(即左外连接)。但是,您要筛选部门 ID 为 NULL 的位置,因为 NULL 部门 ID 将是工作表中没有与部门表匹配的部门 ID 的行。希望对您有所帮助。

SELECT j.id, j.job, j.active, jd.departmentid
FROM job j
LEFT OUTER JOIN jobs jd ON j.id = jd.jobid
LEFT OUTER JOIN department d ON d.id = jd.departmentid
WHERE jd.departmentid IS NULL

【讨论】:

以上是关于SQL 语句 - 排除某些数据的主要内容,如果未能解决你的问题,请参考以下文章

如何使用SQL语句消除重复列

case语句上的sql in()函数

在 Oracle Sql 中的 Select 语句中根据条件排除和包含列标题

SQL NOT IN 仍包含应排除的行

如何从持久化中排除某些 Firebase 数据库节点?

Oracle之sql语句优化