2017-05-04 80 views
-1

我试图从雇员数据库中获得名字,姓氏,部门名称,职称,薪水的前100行,但不知道我是否正确地做。我试过下面的查询,它似乎工作,但感觉不对,因为最后2个连接没有ON语句。它是否正确,是否有更高效的方式可以执行此查询?这是一个正确的MySql查询

这是链接到数据库表格图表,给你一个数据库的想法。 https://dev.mysql.com/doc/employee/en/images/employees-schema.png

我的查询,似乎工作:

SELECT e.first_name, e.last_name, dpn.dept_name, t.title, s.salary 
FROM employees e, dept_emp dp 
INNER JOIN departments dpn 
ON dp.dept_no = dpn.dept_no 
INNER JOIN salaries s 
INNER JOIN titles t 
LIMIT 100; 

我尝试下面的代码,但一直得到错误“#1054 - 未知列‘e.emp_no’在‘关于条款’”开始第二最后一次ON语句。

SELECT e.first_name, e.last_name, dpn.dept_name, t.title, s.salary 
FROM employees e, dept_emp dp 
INNER JOIN departments dpn 
ON dp.dept_no = dpn.dept_no 
INNER JOIN salaries s 
ON e.emp_no = salaries.emp_no 
INNER JOIN titles t 
ON e.emp_no = t.emp_no 
LIMIT 100; 

谢谢!

+0

你(认为你)是什么意思的“前100行”?表格没有排序,直到最外面的排序依据为止。 “试用下面的查询”是什么意思? “似乎有效”是什么意思?和“不舒服”?请阅读[ask]和[mcve]并采取行动。请以表格和DDL文本编辑,不要链接到。 – philipxy

回答

2

您没有加入Ë表和规划表如之间子句:

SELECT e.first_name, e.last_name, dp.dept_name, t.title, s.salary 
    FROM employees e 
    INNER JOIN dept_emp dp on e.emp_no = dp.emp_no 
    INNER JOIN departments dpn ON dp.dept_no = dpn.dept_no 
    INNER JOIN salaries s ON e.emp_no = s.emp_no 
    INNER JOIN titles t ON e.emp_no = t.emp_no 
    LIMIT 100; 
+0

感谢您的反馈,我认为您的代码有一个小错误“INNER JOIN dept_emp dp on e.emp_no = dp.dept_no”ON语句应该是“ON e.emp_no = dp.emp_no”。由于我们正在比较emp_no和你的代码,我们正在比较emp_no和dept_no。 – bluemoon718

+0

@ bluemoon718谢谢你的建议..答案更新..如果我的回答(或其他人)是正确的请标记为已接受...看到这里如何 http://meta.stackexchange.com/questions/5234/how -does接受-的回答工作 – scaisEdge

1

试试这样说:

SELECT e.first_name, e.last_name, departments.dept_name, titles.title, salaries.salary 
FROM employees e 
INNER JOIN dept_emp 
ON e.emp_no = dept_emp.emp_no 
INNER JOIN departments 
ON dept_emp.dept_no = departments.dept_no 
INNER JOIN titles 
ON e.emp_no = titles.emp_no 
INNER JOIN salaries 
ON e.emp_no = salaries.emp_no 
LIMIT 100; 
0

“开”在内部条款加入是可选的。如果您没有“开”条款,则意味着“交叉连接”。 如果你想要的是内连接,那么你应该有一个“On”子句并指定哪些列应该等同。

0
SELECT e.first_name, 
     e.last_name, 
     departments.dept_name, 
     titles.title, 
     salaries.salary 
FROM employees e 
     LEFT JOIN dept_emp 
       ON e.emp_no = dept_emp.emp_no 
     LEFT JOIN departments 
       ON dept_emp.dept_no = departments.dept_no 
     LEFT JOIN titles 
      ON e.emp_no = titles.emp_no 
     LEFT JOIN salaries 
       ON e.emp_no = salaries.emp_no 
LIMIT 100; 

尝试这一个了,因为

INNER JOIN:当有所有表在比赛中返回行。

LEFT JOIN:即使右表中没有匹配,也会从左表中返回所有行。