在通过在线课程学习 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 没有返回类型 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个订单 |