【问题标题】:Joining three tables in SQL, Inner join does not work properlySQL中连接三张表,Inner join不能正常工作
【发布时间】:2014-04-22 10:28:04
【问题描述】:

我们有三个表,documentdepartmentcontact

所有表都由一个“id”列链接。我想要的结果如下

     firstname  lastname  address upload_date  department_name

以下查询获取前四列

  SELECT contact.firstname, contact.lastname,contact.address ,
  document.upload_date
  FROM contact
  JOIN document 
  ON document.id= contact.id
  AND  contact.status = 1 
  AND document.defaultdoc=1

所以这是一个内部连接。

但要获取最后一列,department_name,我添加了与contact.deptId=department.id 类似的连接,但查询返回零结果。有什么问题吗?

【问题讨论】:

  • 如果没有实际的表结构,我们只能猜测。可能是您使用了错误的 ID(文档中的主键而不是外键)
  • 您将document 1 加入contact 1,这不太可能是正确的。 document 表是否有 contact_id 字段?还是有contact_iddocument_id 的链接表?您可能需要向我们提供这三个表中的所有字段名称。或者询问您组织中了解您应该使用哪些字段的人。

标签: mysql sql join


【解决方案1】:

如果你添加

JOIN department 
ON contact.deptId=department.id

它应该可以工作。

【讨论】:

    【解决方案2】:

    如果所有 deptId 都存在于其主表部门中,那么您可以使用以下查询:

    SELECT c.firstname, c.lastname,c.address ,
      doc.upload_date, d.department_name
      FROM contact as c
      JOIN document as doc
      ON doc.id= c.id
      AND  c.status = 1 
      AND doc.defaultdoc=1
      JOIN department as d
      on c.deptId=d.id;
    

    但如果联系人表中更新的部门表中不存在部门表(如果您希望数据库中的引用完整性不应该存在),那么您可以使用以下查询:

    SELECT c.firstname, c.lastname,c.address ,
      doc.upload_date, d.department_name
      FROM contact as c
      JOIN document as doc
      ON doc.id= c.id
      AND  c.status = 1 
      AND doc.defaultdoc=1
      LEFT JOIN department as d
      on c.deptId=d.id;
    

    如果两者都不起作用,则显示您的表格数据和结构。

    【讨论】:

      猜你喜欢
      • 2014-10-31
      • 1970-01-01
      • 2010-11-18
      • 2011-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多