如何对存储过程返回的表使用MySQL“WITH AS”语法?

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

在通过在线课程学习 MySQL 时,我遇到了这个练习(或多或少,我在这里简化了它):

任务 1: 使用公用表表达式 (CTE) 优化以下查询。

SELECT CONCAT("Cl1: ", COUNT(OrderID), "orders") AS "Total" 
FROM Orders WHERE YEAR(Date) = 2022 AND ClientID = "Cl1" 
UNION 
SELECT CONCAT("Cl2: ", COUNT(OrderID), "orders") 
FROM Orders WHERE YEAR(Date) = 2022 AND ClientID = "Cl2";

这是他们的解决方案(我理解):

WITH 
CL1_Orders AS (SELECT CONCAT("Cl1: ", COUNT(OrderID), "orders") AS "Total number of orders"  
FROM Orders WHERE YEAR(Date) = 2022 AND ClientID = "Cl1"), 
CL2_Orders AS (SELECT  CONCAT("Cl2: ", COUNT(OrderID), "orders") 
FROM Orders WHERE YEAR(Date) = 2022 AND ClientID = "Cl2")
SELECT * FROM CL1_Orders UNION SELECT * FROM CL2_Orders;

正如我在课程的前一部分中使用存储过程一样,我想修改解决方案并使用它们。我写了以下代码:

DELIMITER //
CREATE PROCEDURE totalOrders (IN client VARCHAR(10))
BEGIN
    SELECT CONCAT(client, ": ", COUNT(OrderID), "orders") 
    FROM Orders 
    WHERE YEAR(Date) = 2022 AND ClientID = client;
END//

DELIMITER ;
WITH 
SELECT * FROM CALL totalOrders("Cl1") AS cl1,
SELECT * FROM CALL totalOrders("Cl2") AS cl2
SELECT * FROM cl1 UNION SELECT * FROM cl2;

执行它会导致语法错误

ERROR 1064 (42000): 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 'SELECT * FROM CALL totalOrders("Cl1") AS cl1, SELECT * FROM CALL totalOrders("Cl' at line 2

我该如何修复它?怎么了?

mysql stored-procedures common-table-expression
1个回答
0
投票

MySQL 没有返回类型 TABLE,所以你需要采取你的方法

就像临时表一样

仅供参考:从来没有用列名命名变量,每个数据库都有问题来确定你的意思,更简单的是在前面有一个p_,这可以帮助你更好地重新编写代码,数据库有机会给你正确的答案

CREATE tABLE Orders (OrderID int, client varchar(10),ClientID int,  Date date) 
INSERT INTO Orders VALUES ( 1,'test1',1,NOW() - INTERVAL 2 YEAR);
INSERT INTO Orders VALUES ( 2,'test2',2,NOW() - INTERVAL 2 YEAR)
CREATE Temporary table t_temop (Orderclinet varchar(100)) 
CREATE PROCEDURE totalOrders (IN p_client VARCHAR(10))
BEGIN
     INSERT INTO t_temop
    SELECT CONCAT(MAX(client), ": ", COUNT(OrderID), " order(s)") 
    FROM Orders 
    WHERE YEAR(Date) = 2022 AND ClientID = p_client;
END
CALL totalOrders(1);
  CALL totalOrders(2);
SELECT * FROM t_temop
订购专线
测试1:1个订单
测试2:1个订单

小提琴

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.