3

我仍处于 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返回工作代码,但显然我忘记了一些东西。

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

4

3 回答 3

2

您可以使用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;

查看此演示。让我知道它是否有效。

于 2013-07-10T00:10:04.820 回答
0
select  job
from    job
where   id not in   (select jobId
                    from    jobs)
于 2013-07-10T00:10:19.937 回答
0

不幸的是,我不在一个可以测试结果的环境中。然而,这背后的基本思考过程是,每当您想从一个表中返回没有来自另一个表的匹配行的行时,您必须进行外连接。目的是要显示作业表中的所有行(即左外连接)。但是,您要过滤部门 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
于 2013-07-10T00:29:56.263 回答