mysql left join的時候又表是多條記錄的話,會出現冗餘的情況

若-飞發表於2024-04-03
mysql left join 右表多條記錄

MySQL中的LEFT JOIN語句用於從左表(table1)中返回所有記錄,即使右表(table2)中沒有匹配的記錄。如果右表有多條匹配左表中一條記錄的記錄,結果中將會有多個行反映這一點。

例如,有兩個表:

  1. employees (左表)

employee_id employee_name
1 John Doe
2 Jane Smith
  1. salaries (右表)

employee_id salary year
1 50000 2019
1 52000 2020
2 60000 2019

如果你想要獲取所有員工及其薪資資訊,即使某些員工沒有薪資資訊,你可以使用LEFT JOIN:

SELECT e.employee_id, e.employee_name, s.salary, s.year
FROM employees e
LEFT JOIN salaries s ON e.employee_id = s.employee_id;

這將返回:

employee_id employee_name salary year
1 John Doe 50000 2019
1 John Doe 52000 2020
2 Jane Smith 60000 2019

如果你注意到,由於John Doe有兩個薪資條目,在結果集中他會顯示兩次,與右表中的每條記錄匹配。這是LEFT JOIN的特性之一,它保證了左表(employees)中的所有記錄都會出現在結果集中,即使右表(salaries)中沒有匹配的記錄。

如果為了保證leftjoin的記錄的唯一性,右邊可以採用distint獲取一下唯一性:

SELECT e.employee_id, e.employee_name, s.salary, s.year
FROM employees e
LEFT JOIN (SELECT DISTINCT ON (employee_id) * FROM salaries) as  s ON e.employee_id = s.employee_id;

相關文章