mysql JOIN -为什么这些查询提供不同的输出?

r3i60tvu  于 11个月前  发布在  Mysql
关注(0)|答案(1)|浏览(97)

我用一个示例数据库测试了两个查询。我希望它们有相同的输出,但输出是不同的,我不明白为什么。
有没有人能给我解释一下:
1.为什么版本3提供的输出与版本2不同?
1.第10行24行33行41行50行59行67行73行100行132行139行147行162行169行是什么原因导致它们被排除在第3版输出之外?我找不到任何区别于输出中包含的所有其他行的因素。
版本2代码

SELECT 
    de.emp_no, de.from_date, de.to_date
FROM
    dept_emp_dup de
        JOIN
    (SELECT 
        emp_no, MAX(from_date) AS from_date, to_date
    FROM
        dept_emp_dup
    WHERE
        to_date > SYSDATE()
    GROUP BY emp_no) de1 ON de1.emp_no = de.emp_no
WHERE
    de1.to_date = de.to_date;

字符串
版本3代码

SELECT 
    de.emp_no, de.from_date, de.to_date
FROM
    dept_emp_dup de
        JOIN
    (SELECT 
        emp_no, MAX(from_date) AS from_date, to_date
    FROM
        dept_emp_dup
    GROUP BY emp_no) de1 ON de1.emp_no = de.emp_no
WHERE
    de1.to_date > SYSDATE()
        AND de1.to_date = de.to_date;


以下链接中的Excel文件包含以下工作表
1.完整数据
1.在Excel中过滤的正确输出
1.版本2查询输出
1.版本3查询输出

yptwkmov

yptwkmov1#

第一个查询中的子查询格式不好,不幸的是MySQL接受了它并运行它。这是你拥有的代码:

SELECT 
  emp_no, MAX(from_date) AS from_date, to_date
FROM
  dept_emp_dup
WHERE
  to_date > SYSDATE()
GROUP BY emp_no

字符串
所有没有包含在GROUP BY子句中的列都应该在选择列表中聚合。* 违规列 * 是to_date。简而言之,它应该修改为:

SELECT emp_no, MAX(from_date) AS from_date, to_date
FROM dept_emp_dup
WHERE to_date > SYSDATE()
GROUP BY emp_no, to_date -- added to the GROUP BY clause


或:

SELECT emp_no, MAX(from_date) AS from_date, 
  MAX(to_date) as to_date -- aggregated with MAX()
FROM dept_emp_dup
WHERE to_date > SYSDATE()
GROUP BY emp_no

相关问题