【问题标题】:Multiple table outputs based on one query基于一个查询的多个表输出
【发布时间】:2022-01-12 01:33:24
【问题描述】:

我有一张包含 12 个条件(月)的表。我需要为 select 语句生成 12 个输出(表),其中唯一改变的是一个条件(月)。

例子:

SELECT * FROM table WHERE month = 01;
SELECT * FROM table WHERE month = 02;
SELECT * FROM table WHERE month = 03;

等等

实际上,代码又大又粗,我不想为了改变一个条件而多次复制粘贴。

有没有办法编写一个语句来根据变化的条件产生不同的输出?

对我来说这看起来很基本,但我找不到答案。

【问题讨论】:

  • T-SQL 和 PL/SQL 是完全不同的方言,由完全不同的 RDBMS(分别为 SQL Server 和 Oracle)使用。请只标记您真正使用的内容。
  • 为什么不只使用参数化查询,例如使用存储过程..?然后你可以调用同一个查询 12 次,改变参数就可以了。
  • 我知道这听起来很奇怪,但是我分别使用了两个 RDBMS,这就是为什么我对两者都问了同样的问题。我正在考虑使用 SP,但我希望有一种方法可以以某种方式循环选择语句,因为有时我需要更改参数不止 12 次​​span>

标签: sql dynamic-sql


【解决方案1】:

它听起来不是一个好方法,但是如果没有更全面的任务图就很难说。

您可以做的是生成一个数字列表并使用它来生成您需要的语句,例如:

with months as (
    select 1 m
    union all
    select m + 1 from months
    where m<12
)
select Concat('select * from table where month = ', m, ';')
from months

根据您的要求和 RDBMS,您可以直接在 IDE 中使用它们或动态执行。

【讨论】:

    【解决方案2】:

    在 Oracle 中,您可以使用分层查询来生成月份;像这样:

    SQL> select empno,
      2         ename,
      3         job,
      4         to_char(hiredate, 'fmMonth', 'nls_date_language = english') month
      5  from emp
      6  where extract(month from hiredate) in (select level from dual
      7                                         connect by level <= 12
      8                                        )
      9  order by extract (month from hiredate);
    
         EMPNO ENAME      JOB       MONTH
    ---------- ---------- --------- ------------------------------------
          7876 ADAMS      CLERK     January
          7934 MILLER     CLERK     January
          7499 ALLEN      SALESMAN  February
          7521 WARD       SALESMAN  February
          7566 JONES      MANAGER   April
          7698 BLAKE      MANAGER   May
          7782 CLARK      MANAGER   June
          7844 TURNER     SALESMAN  September
          7654 MARTIN     SALESMAN  September
          7839 KING       PRESIDENT November
          7788 SCOTT      ANALYST   December
          7369 SMITH      CLERK     December
          7900 JAMES      CLERK     December
          7902 FORD       ANALYST   December
    
    14 rows selected.
    
    SQL>
    

    【讨论】:

      【解决方案3】:

      可以像left/right join 到cte 一样简单

      declare @table table (mm smallint,somedata varchar(20))
      insert into @table
      values 
      (1,'some data for 1')
      ,(3,'some data for 3')
      ,(5,'some data for 5')
      
      
      ;with cte_months as (
          select 1 mm
          union all
          select mm + 1 from cte_months
          where mm<12
      )
      select c.mm,t.somedata from @table t
      right  join cte_months c on t.mm = c.mm
      

      【讨论】:

        猜你喜欢
        • 2015-08-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-15
        • 1970-01-01
        相关资源
        最近更新 更多