在从一个在线课程学习MySQL时,我偶然发现了这个练习(或多或少,我在这里简化它):
Task 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
我怎么才能修好它呢?怎么啦?