两个查询看起来相同但行为不同

时间:2020-07-05 14:44:36

标签: mysql sql

我正在上有关Udemy的MySQL课程,但遇到了一个我无法解释的问题:

查询1(我的查询)不返回任何内容,仅在“动作输出”面板中显示“确定”。 查询2(课程提供的解决方案)确实返回了所需的值。

问题:对我来说,它们看起来完全一样-如果按照我的说法,MySQL不区分大小写。

非常感谢有人可以指出这个错误,尽管我看了太久了,但还是错过了我,这让我看起来很荒谬。

您,R

查询1:

delimiter $$
create function emp_info_rom(p_first_name varchar(255), p_last_name varchar(255)) returns decimal(10,2)
deterministic no sql reads sql data
begin
declare v_max_from_date date;
declare v_salary decimal (10,2);
   
select max(from_date)

into v_max_from_date
from
    employees e
    join salaries s on e.emp_no = s.emp_no
    where e.first_name = p_first_name and e.last_name = p_last_name;

select s salary
into v_salary
from
    employees e
    join salaries s on e.emp_no = s.emp_no
    where e.first_name = p_first_name 
        and e.last_name = p_last_name 
        and s.from_date = v_max_from_date;

Return v_salary;
end$$
delimiter ;

查询2:

DELIMITER $$
CREATE FUNCTION emp_info(p_first_name varchar(255), p_last_name varchar(255)) RETURNS   decimal(10,2)
DETERMINISTIC NO SQL READS SQL DATA
BEGIN
    DECLARE v_max_from_date date;
    DECLARE v_salary decimal(10,2);
SELECT
       MAX(from_date)
INTO v_max_from_date FROM
       employees e
        JOIN
        salaries s ON e.emp_no = s.emp_no
WHERE
    e.first_name = p_first_name
        AND e.last_name = p_last_name;
SELECT
    s.salary
INTO v_salary FROM
    employees e
        JOIN
    salaries s ON e.emp_no = s.emp_no
WHERE
        e.first_name = p_first_name
        AND e.last_name = p_last_name
        AND s.from_date = v_max_from_date;
RETURN v_salary;
END$$
DELIMITER ;

某处一定有区别,但我看不到:o /

1 个答案:

答案 0 :(得分:0)

您有错字:

select s salary into v_salary

在第二个查询中。除非您有名为s的列,否则应返回语法错误。

也就是说,您可以使用ORDER BYLIMIT来简化此操作:

SET v_salary = (SELECT s.salary
                FROM employees e JOIN
                     salaries s
                     ON e.emp_no = s.emp_no
                WHERE e.first_name = p_first_name AND e.last_name = p_last_name
                ORDER BY s.from_date DESC
                LIMIT 1
               );

我很惊讶课程的答案没有使用这样的东西。重复JOIN和过滤不仅是多余的,而且容易出错并且性能较低。