【问题标题】:MySQL Stored Procedure with Multiple Select statements From Different Tables具有来自不同表的多个选择语句的 MySQL 存储过程
【发布时间】:2013-12-17 13:14:20
【问题描述】:

我正在尝试从 mysql 存储过程中的不同表中进行多项选择,如下所示

DELIMITER //  
CREATE PROCEDURE `NovemberSummary`(IN `branch` VARCHAR(60), IN `year` INT) NOT 
DETERMINISTIC CONTAINS SQL SQL SECURITY DEFINER 
BEGIN
select sum(sales.amount) as Sales from sales where month (sales.date)= 11 and 
sales.branch = branch;
select sum(expenses.amount) as Expenses from expenses where month(expenses.date)= 11
and expenses.branch = branch;
END

但它只返回第一个选择,因为结果集中只包含销售列。

MySQL 版本是 5.6.11 - MySQL 社区服务器

【问题讨论】:

  • 您需要使用您的 API 请求后续结果集。
  • 嗨,这在 Eclipse BIRT 中可行吗?

标签: mysql stored-procedures


【解决方案1】:

试试这个方法:

DELIMITER //  
CREATE PROCEDURE `NovemberSummary`(IN `branch` VARCHAR(60), IN `year` INT) NOT 
DETERMINISTIC CONTAINS SQL SQL SECURITY DEFINER 
BEGIN
SELECT 
   ( select sum(sales.amount) from sales 
     where month (sales.date)= 11 and sales.branch = branch ) as Sales ,
   ( select sum(expenses.amount) from expenses 
     where month(expenses.date)= 11 and expenses.branch = branch ) as Expenses 
   ;
END

此过程仅返回一个结果集,其中包含两列:销售额 + 费用:

+-------+----------+
| Sales | Expenses |
+-------+----------+
|    20 |       15 |
+-------+----------+

,而不是只有一列的两个结果集。

+-------+
| Sales |
+-------+
|    20 |
+-------+

+----------+
| Expenses |
+----------+
|       15 |
+----------+

【讨论】:

  • 如果您在 SELECT 语句中获取 2 列或多于 2 列,它将不起作用。它会给出错误“操作数应包含 1 列”。如何处理这些情况?
【解决方案2】:
CREATE PROCEDURE get_data ()
BEGIN
  SELECT Code, Name, Population, Continent FROM Country
    WHERE Continent = 'Oceania' AND Population < 10000;
  SELECT Code, Name, Population, Continent FROM Country
    WHERE Continent = 'Europe' AND Population < 10000;
  SELECT Code, Name, Population, Continent FROM Country
    WHERE Continent = 'North America' AND Population < 10000;
END;

【讨论】:

  • 这不会给出所问的内容。带有上述查询的 MARIA DB PROCEDURE 将仅返回第一个 SELECT 语句的输出。虽然问题是在结果中要求 2 个输出表。在玛丽亚数据库“;” (分号)被视为语句终止运算符。
【解决方案3】:

试试这个

CREATE PROCEDURE `NovemberSummary`(IN `branch` VARCHAR(60), IN `year` INT) NOT 

DETERMINISTIC CONTAINS SQL SQL SECURITY DEFINER 

BEGIN

DECLARE SalesAmount VARCHAR(255) DEFAULT 0;
DECLARE ExpensesAmount VARCHAR(255) DEFAULT 0;

SELECT SUM(sales.amount) AS Sales INTO SalesAmount FROM sales WHERE MONTH (sales.date)= 11 AND 

sales.branch = branch;

SELECT SUM(expenses.amount) AS Expenses INTO ExpensesAmount FROM expenses WHERE MONTH(expenses.date)= 11

AND expenses.branch = branch;

SELECT SalesAmount AS Sales, ExpensesAmount AS Expenses;

END

【讨论】:

    【解决方案4】:

    在存储过程中使用多选语句

    试试下面的查询。

        select distinct ProdSubCategory, NULL,NULL
    from Table1
    inner join Table2 on ID_FK= ID_PK
    where Table2.Type=@chvType and Table1.ProdCategory=@chvProdSubCategory
    
    UNION ALL
    
    select NULL, Brand,NULL
    from Table1
    inner join Table2 on ID_FK= ID_PK
    where Table2.Type=@chvType and Table1.ProdCategory=@chvProdSubCategory
    
    UNION ALL
    select NULL, Price,NULL
    from Table1
    inner join Table2 on ID_FK= ID_PK
    where Table2.Type=@chvType and Table1.ProdCategory=@chvProdSubCategor
    

    【讨论】:

      【解决方案5】:
      BEGIN
      DELETE FROM ut_axis_balance WHERE oth_refer = 'CLGBAL';
      UPDATE ut_axis_karvy SET mfund_code = '200' where mfund_code IN ( SELECT mfund_code FROM ut_axis_karvy WHERE mfund_code = '039' );
      UPDATE ut_axis_karvy SET mfund_code = '160' where mfund_code IN ( SELECT mfund_code FROM ut_axis_karvy WHERE mfund_code = '106' );
      UPDATE ut_axis_karvy SET mfund_code = '128' where mfund_code IN ( SELECT mfund_code FROM ut_axis_karvy WHERE mfund_code = '107' );
      UPDATE ut_axis_karvy SET mfund_code = '171' where mfund_code IN ( SELECT mfund_code FROM ut_axis_karvy WHERE mfund_code = '123' );
      UPDATE ut_axis_karvy SET mfund_code = '193' where mfund_code IN ( SELECT mfund_code FROM ut_axis_karvy WHERE mfund_code = '119' );
      UPDATE ut_axis_karvy SET mfund_code = '193' where mfund_code IN ( SELECT mfund_code FROM ut_axis_karvy WHERE mfund_code = '121' );
      UPDATE ut_axis_karvy SET mfund_code = '193' where mfund_code IN ( SELECT mfund_code FROM ut_axis_karvy WHERE mfund_code = '202' );
      UPDATE ut_axis_karvy SET mfund_code = '161' where mfund_code IN ( SELECT mfund_code FROM ut_axis_karvy WHERE mfund_code = '120' );
      UPDATE ut_axis_karvy SET mfund_code = '160' where mfund_code IN ( SELECT mfund_code FROM ut_axis_karvy WHERE mfund_code = '166' );
      UPDATE ut_axis_karvy SET mfund_code = '160' where mfund_code IN ( SELECT mfund_code FROM ut_axis_karvy WHERE mfund_code = '167' );
      UPDATE ut_axis_karvy SET mfund_code = '160' where mfund_code IN ( SELECT mfund_code FROM ut_axis_karvy WHERE mfund_code = '175' );
      UPDATE ut_axis_karvy SET mfund_code = '042' where mfund_code IN ( SELECT mfund_code FROM ut_axis_karvy WHERE mfund_code = '200' );
      UPDATE ut_axis_karvy SET mfund_code = '193' where mfund_code IN ( SELECT mfund_code FROM ut_axis_karvy WHERE mfund_code = '202' );
      UPDATE ut_axis_karvy SET mfund_code = '161' where mfund_code IN ( SELECT mfund_code FROM ut_axis_karvy WHERE mfund_code = '266' );
      UPDATE ut_axis_karvy SET mfund_code = '193' where mfund_code IN ( SELECT mfund_code FROM ut_axis_karvy WHERE mfund_code = '495' );
      UPDATE ut_axis_karvy SET mfund_code = '177' where mfund_code IN ( SELECT mfund_code FROM ut_axis_karvy WHERE mfund_code = '003' );
      UPDATE ut_axis_karvy SET mfund_code = '177' where mfund_code IN ( SELECT mfund_code FROM ut_axis_karvy WHERE mfund_code = '132' );
      UPDATE ut_axis_karvy SET mfund_code = '177' where mfund_code IN ( SELECT mfund_code FROM ut_axis_karvy WHERE mfund_code = '144' );
      END
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 2011-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-24
      相关资源
      最近更新 更多