【问题标题】:SQL Statement - Excluding certain dataSQL 语句 - 排除某些数据
【发布时间】: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,但显然我忘记了一些事情。

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

【问题讨论】:

    标签: sql select many-to-many inner-join where


    【解决方案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
      

      【讨论】:

        猜你喜欢
        • 2018-02-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-10
        • 1970-01-01
        相关资源
        最近更新 更多