提问者:小点点

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


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

查询1(我的)不返回任何东西,只是在操作输出面板中显示一个“OK”。 查询2(课程中提供的解决方案)确实返回了required值。

问题:它们在我看来完全一样--如果像我已经被告知的那样,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 ;

一定有什么不同,但我看不出来


共1个答案

匿名用户

您有一个打字错误:

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
               );

我很惊讶这门课的答案没有用到这样的东西。 重复连接和筛选不仅是多余的,而且容易出错和降低性能。