SQLyog 函数:从 INNER JOIN 返回值时出现语法错误
SQLyog Function: Syntax error when returning values from INNER JOIN
我正在编写一个 SQLyog 函数来根据客户花费的金额查找客户的状态。他们花费的金额位于付款 table 中,所有客户详细信息位于客户 table.
中
编辑:请注意,当输出仅为 CustStatus
时,该函数有效,似乎问题与包含其他 return 值有关。
这是我收到的错误:
Error Code: 1064 You have an error in your SQL syntax; check the
manual that corresponds to your MySQL server version for the right
syntax to use near ' VARCHAR(50), VARCHAR(50), VARCHAR(10)
DETERMINISTIC
BEGIN DECLARE k1 INT(11' at line 2
DROP FUNCTION IF EXISTS DTC_VIP_members $$
CREATE FUNCTION DTC_VIP_members (v1 INT(11))
RETURNS INT(11), VARCHAR(50), VARCHAR(50), VARCHAR(10) DETERMINISTIC
BEGIN
DECLARE k1 INT(11);
DECLARE CustStatus VARCHAR(10);
SELECT SUM(payment.SaleAmt) INTO k1
FROM payment
INNER JOIN clients
ON payment.client_id = clients.client_id
WHERE payment.client_id = v1;
IF k1 >= 300 THEN
UPDATE clients
SET clients.CustStatus = 'VIP';
ELSE
UPDATE clients
SET clients.CustStatus = 'Non-VIP';
END IF;
RETURN clients.client_id, clients.first_name, clients.last_name, clients.CustStatus;
END $$
DELIMITER ;
抱歉,您的方法看起来不对。
首先:我建议使用 STORED PROCEDURE 而不是 FUNCTION
其次:使用没有 WHERE
条件的 UPDATE
语句会导致更新 table 中的所有行,这似乎也是错误的。
所以我们的存储过程可以看起来像:
DROP PROCEDURE IF EXISTS DTC_VIP_members $$
CREATE PROCEDURE DTC_VIP_members (v1 INT(11))
BEGIN
DECLARE k1 INT(11);
DECLARE CustStatus VARCHAR(10);
SELECT SUM(payment.SaleAmt) INTO k1
FROM payment
INNER JOIN clients
ON payment.client_id = clients.client_id
WHERE payment.client_id = v1;
IF k1 >= 300 THEN
UPDATE clients
SET clients.CustStatus = 'VIP'
WHERE clients.client_id = v1; -- update only one record
ELSE
UPDATE clients
SET clients.CustStatus = 'Non-VIP'
WHERE clients.client_id = v1; -- update only one record
END IF;
-- select relevant data
SELECT
clients.client_id, clients.first_name, clients.last_name, clients.CustStatus
FROM clients
WHERE clients.client_id = v1;
END $$
DELIMITER ;
已解决!
感谢您花时间查看和回复 Slava!
是的,您的方法是一个更好的设计,并且可能会出现我所有愚蠢的 SQL 语法错误。
我了解到,在 SQLyog 服务器版本中,我正在处理函数只能 RETURN 一个值。所以我的设计从一开始就存在缺陷。
因为SQLyog函数只能return单值“vip”或“non-vip”。
我尝试使用 select 来达到预期的效果。
Select 名字,姓氏,...。 DTC_VIP_members(….);
希望这个答案能帮助任何其他尝试从 SQLyog 免费版本学习 SQL 的初学者。
左上角
DELIMITER $$
DROP FUNCTION IF EXISTS `DTC_VIP_members`$$
CREATE DEFINER=`yadda`@`%` FUNCTION `DTC_VIP_members`(v1 INT(11)) RETURNS VARCHAR(10) CHARSET latin1
DETERMINISTIC
BEGIN
DECLARE k1 INT(11);
DECLARE CustStatus VARCHAR(10);
SELECT SUM(SaleAmt) INTO k1
FROM payment
WHERE client_id = v1;
IF k1 >= 300 THEN
SET CustStatus = 'VIP';
ELSE
SET CustStatus = 'Non-VIP';
END IF;
RETURN CustStatus;
END$$
DELIMITER ;
--------------------------------------
SELECT first_name, last_name, email, mobile_number, `DTC_VIP_members`(client_id)
FROM clients;
我正在编写一个 SQLyog 函数来根据客户花费的金额查找客户的状态。他们花费的金额位于付款 table 中,所有客户详细信息位于客户 table.
中编辑:请注意,当输出仅为 CustStatus
时,该函数有效,似乎问题与包含其他 return 值有关。
这是我收到的错误:
Error Code: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' VARCHAR(50), VARCHAR(50), VARCHAR(10) DETERMINISTIC
BEGIN DECLARE k1 INT(11' at line 2
DROP FUNCTION IF EXISTS DTC_VIP_members $$
CREATE FUNCTION DTC_VIP_members (v1 INT(11))
RETURNS INT(11), VARCHAR(50), VARCHAR(50), VARCHAR(10) DETERMINISTIC
BEGIN
DECLARE k1 INT(11);
DECLARE CustStatus VARCHAR(10);
SELECT SUM(payment.SaleAmt) INTO k1
FROM payment
INNER JOIN clients
ON payment.client_id = clients.client_id
WHERE payment.client_id = v1;
IF k1 >= 300 THEN
UPDATE clients
SET clients.CustStatus = 'VIP';
ELSE
UPDATE clients
SET clients.CustStatus = 'Non-VIP';
END IF;
RETURN clients.client_id, clients.first_name, clients.last_name, clients.CustStatus;
END $$
DELIMITER ;
抱歉,您的方法看起来不对。
首先:我建议使用 STORED PROCEDURE 而不是 FUNCTION
其次:使用没有 WHERE
条件的 UPDATE
语句会导致更新 table 中的所有行,这似乎也是错误的。
所以我们的存储过程可以看起来像:
DROP PROCEDURE IF EXISTS DTC_VIP_members $$
CREATE PROCEDURE DTC_VIP_members (v1 INT(11))
BEGIN
DECLARE k1 INT(11);
DECLARE CustStatus VARCHAR(10);
SELECT SUM(payment.SaleAmt) INTO k1
FROM payment
INNER JOIN clients
ON payment.client_id = clients.client_id
WHERE payment.client_id = v1;
IF k1 >= 300 THEN
UPDATE clients
SET clients.CustStatus = 'VIP'
WHERE clients.client_id = v1; -- update only one record
ELSE
UPDATE clients
SET clients.CustStatus = 'Non-VIP'
WHERE clients.client_id = v1; -- update only one record
END IF;
-- select relevant data
SELECT
clients.client_id, clients.first_name, clients.last_name, clients.CustStatus
FROM clients
WHERE clients.client_id = v1;
END $$
DELIMITER ;
已解决! 感谢您花时间查看和回复 Slava! 是的,您的方法是一个更好的设计,并且可能会出现我所有愚蠢的 SQL 语法错误。 我了解到,在 SQLyog 服务器版本中,我正在处理函数只能 RETURN 一个值。所以我的设计从一开始就存在缺陷。
因为SQLyog函数只能return单值“vip”或“non-vip”。 我尝试使用 select 来达到预期的效果。 Select 名字,姓氏,...。 DTC_VIP_members(….);
希望这个答案能帮助任何其他尝试从 SQLyog 免费版本学习 SQL 的初学者。 左上角
DELIMITER $$
DROP FUNCTION IF EXISTS `DTC_VIP_members`$$
CREATE DEFINER=`yadda`@`%` FUNCTION `DTC_VIP_members`(v1 INT(11)) RETURNS VARCHAR(10) CHARSET latin1
DETERMINISTIC
BEGIN
DECLARE k1 INT(11);
DECLARE CustStatus VARCHAR(10);
SELECT SUM(SaleAmt) INTO k1
FROM payment
WHERE client_id = v1;
IF k1 >= 300 THEN
SET CustStatus = 'VIP';
ELSE
SET CustStatus = 'Non-VIP';
END IF;
RETURN CustStatus;
END$$
DELIMITER ;
--------------------------------------
SELECT first_name, last_name, email, mobile_number, `DTC_VIP_members`(client_id)
FROM clients;