【问题标题】:Select all data include another table even if null选择所有数据包括另一个表,即使为空
【发布时间】:2013-01-22 07:44:02
【问题描述】:

设置: (1) Employee表(employeeID、firstName、lastName)

(1) 鞋表(shoeID、Employee_employeeID、shoeName、shoeColor、shoeBrand)

我想选择 Employee 表中的所有行,即使鞋表中没有匹配的 EmployeeID (Employee_EmployeeID) 也会显示整行。所需输出示例:

 EmployeeID  | firstName    | lastName    | shoeName     |   shoeColor  | shoeBrand

 1            John           Smith         AirMax2          Red          Nike
 2            Ronald         Mcdonald      null             null         null
 3            James          Knight        null             null         null
 4            Cindy          Smith         Pump             Brown        Cole Haan

我已经尝试了很多不同的连接,我会得到每个员工的重复行。

【问题讨论】:

  • 我认为这正是 LEFT OUTER JOIN 所做的……我错过了什么吗?是否存在,例如,每位员工不止一只鞋,但您希望数据库引擎任意选择返回一只鞋?
  • Matchu 说的。另外,显示您尝试过的一些查询,以便我们告诉您您做错了什么:)
  • 是的,你们都是对的。我以为我已经阅读并理解了左连接..显然不是。感谢您的回复。

标签: mysql sql


【解决方案1】:

试试这个

   SELECT e.employeeId,e.firstName,e.lastName,s.ShoeName,s.ShoeColor,s.ShoeBrand 
   FROM    Employee e
   LEFT JOIN Shoe s
   ON e.employeeID = s.Employee_employeeID

DEMO SQLFIDDLE HERE

【讨论】:

  • 这是正确的.. 将其标记为答案,因为它被投票赞成。谢谢!
  • 很高兴它对您有所帮助,欢迎您!祝你好运!
  • 如果我有WHERE x=?,我该怎么做?
  • @Marcel 已经很老了,你可能已经明白了,无论如何,为了完整起见,还是想添加它。例如,您可以在 echo_Me 的查询末尾附加 WHERE e.lastName="radi",并在他的 SQLFiddle 中进行了测试。
  • 谢谢,这帮助我完成了作业。
【解决方案2】:

你需要一个left outer join:

select e.employeeid, e.firstname, e.lastname, s.shorname, s.shoecolor, s.shoebrand
from employee e left outer join
     shoe s
     on e.employeeid = s.employeeid

【讨论】:

    【解决方案3】:

    您将要使用LEFT JOIN

    select e.employeeId,
      e.firstName,
      e.lastName,
      s.ShoeName,
      s.ShoeColor,
      s.ShoeBrand
    from Employee e
    left join shoe s
      on e.employeeID = s.Employee_employeeID
    

    SQL Fiddle with Demo

    即使shoe 表中没有匹配的行,LEFT JOIN 也会从employee 表中返回匹配的行。

    如果您在学习JOIN 语法方面需要帮助,这里有一个很棒的visual explanation of joins

    现在,如果您想要匹配两个表的所有行,那么您可以使用INNER JOIN

    【讨论】:

    • @Jordan 没问题,当你有代表时,你总是可以回来投票。 :)
    猜你喜欢
    • 2022-10-18
    • 2021-12-30
    • 1970-01-01
    • 2017-03-08
    • 2017-01-02
    • 2016-06-21
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    相关资源
    最近更新 更多