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 JOIN
。 LEFT 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 语句 - 排除某些数据的主要内容,如果未能解决你的问题,请参考以下文章