【问题标题】:Declare statement in PL/SQL for a part of the query在 PL/SQL 中为查询的一部分声明语句
【发布时间】:2017-08-08 09:55:05
【问题描述】:

我有如下查询:

select t1.varid, t1.var1, t1.var2, t1.vardata, t2.varid, t2.var1, t2,.var2 
from   table1 t1, table2 t2
where  t1.varid = t2.varid
and    t1.vardata between to_date('20170807','YYYYMMDD') and to_date('20170808','YYYYMMDD')

现在的问题是: 我不仅需要在上面查询中指定的数据范围内提取数据,而且还想在同一个查询中提取许多其他范围内的数据。

为此,我使用了UNION ALL,它可以工作。问题是这部分我得重写很多次:

select t1.varid, t1.var1, t1.var2, t1.vardata, t2.varid, t2.var1, t2, var2 
from   table1 t1, table2 t2
where  t1.varid = t2.varid

是否有关于如何将select t1.varid... 定义为命名变量以避免冗长乏味的重复查询的提示?

欢迎任何其他解决方案。

【问题讨论】:

  • 至少不在SQL。或者,您可以编写一个过程并传递日期范围以获得所需的输出。
  • 嗨,XING,我不明白:是否不可能:将(从表中选择 var1、var2、...)定义为名称变量?好像很奇怪……
  • 我的意思是,你无法避免长时间无聊UNION ALL。当您在查询中放置具有不同时间范围的 OR 子句时,还有什么问题。
  • 好的,但是如何简化这部分:(select var1, var2,... from table) in other to each union all not rewrite it...
  • 检查我的答案。这就是我要问的。如果你像我在下面展示的那样做会有什么问题吗?

标签: oracle plsql union declare


【解决方案1】:

正如聊天中所讨论的,您可以按照以下方式进行操作:

SELECT t1.varid  as col1,
       t1.var1   as col2,
       t1.var2,
       t1.vardata,
       t2.varid,
       t2.var1,
       t2,
       .var2
  FROM table1 t1, table2 t2
 WHERE     t1.varid = t2.varid
       AND t1.vardata BETWEEN TO_DATE ('20170807', 'YYYYMMDD')
                          AND TO_DATE ('20170808', 'YYYYMMDD')
        --- Give date ranges.                  
       OR   t1.vardata BETWEEN TO_DATE ('20170907', 'YYYYMMDD')
                          AND TO_DATE ('20171008', 'YYYYMMDD')                  
       OR ....
       OR ....

【讨论】:

  • 非常感谢XING,所以没有必要使用Union all,但解决方案是使用OR 的范围..
  • 我也借此机会问您如何将“select... from..”部分定义为变量,是否可以将此部分定义为“namevariable”?
  • 确实如此。如果您的表格是 same 并且唯一变化的部分是日期范围,那么 OR 应该可以完成这项工作。您可以Alias 列名。见示例
  • "select... from.." is it possible to define this part as "namevariable。这是可能的,但在PLSQ 中不是SQL
  • 好的,让我创建一个新任务。
【解决方案2】:

您可以尝试直接从这样的表中获取日期,而不是重写重复的语句:

Select 'select t1.varid, t1.var1, t1.var2, t1.vardata, t2.varid, t2.var1, t2,.var2 
From table1 t1, table2 t2 where t1.varid = t2.varid and t1.vardata between to_date('''+MY_DATE+''', ''yyyymmdd'')'  from tableofdate 

以下是我使用的架构。这只是一个示例。请根据您的要求进行编辑

create table tableofdate(my_date varchar(100))
insert into tableofdate values ('20170808')

【讨论】:

  • 谢谢,但我不想创建表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多