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

问题描述 投票:0回答:1

我使用了示例数据库来测试两个查询。我期望它们有相同的输出,但输出不同,我不明白为什么。

有人可以向我解释一下吗:

  1. 为什么版本 3 提供的输出与版本 2 不同?
  2. 第 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;

下面LINK中的 Excel 文件包含带有

的工作表
  1. 完整数据
  2. 在 Excel 中过滤的正确输出
  3. ver 2 查询输出
  4. 第 3 版查询输出
mysql sql mysql-workbench inner-join
1个回答
0
投票

第一个查询中的子查询格式不正确,不幸的是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
© www.soinside.com 2019 - 2024. All rights reserved.