【问题标题】:How work with subquery in a View?如何在视图中使用子查询?
【发布时间】:2011-09-12 19:23:58
【问题描述】:

我需要为这个 Query 创建一个 View允许更改 m.arq_datam2 .arq_data 值选择使用此视图,如:

select * FROM the_view WHERE m.arq_data = X AND m2.arq_data = Y

这是我当前的查询:

SELECT distinct(p.num_processo),p.num_proc_jud,a.assunto,su.subassunto,ma.Materia,u.Unidade ,M.COD_UNIDADE as cod_serv ,u.Unidade as servidor  ,' '  as serv_ativo,
'  '  as data_vinc ,' '  as  V_ativo, M.motivo,M.data_movimentacao as data_mov_distr ,
(select max(m2.arq_data)  from movimentacao m2 where  m2.arq_data 
BETWEEN '2011-08-01 00:00:00'AND '2011-08-31 23:00:00' and m2.num_processo =
  p.num_processo) as Data_Arq_Desarq , status = 'A'

--pra view
, M.arq_data

FROM processo p 
INNER JOIN assunto a ON a.cod_assunto  = p.cod_assunto  
INNER JOIN subassunto su ON su.cod_subassunto  = p.cod_subassunto
LEFT  JOIN materia ma ON ma.cod_materia  = p.cod_materia 
inner JOIN movimentacao M on M.num_processo = p.num_processo
INNER JOIN Unidade u ON u.cod_unidade  = M.COD_UNIDADE  
where 
not exists(select * from anexos a where a.num_proc_anexo = p.num_processo and a.ativo = 1) 
and not exists(select * from movimentacao m1 where m1.num_movimentacao= M.num_movimentacao and m1.motivo = 10 and m1.arquivado = 0) 
and ( not exists (select  * from distrib_vincjud  d2 where d2.num_processo = p.num_processo) 
or  p.num_processo in  (select  d3.num_processo from distrib_vincjud  d3  
                         where d3.num_processo = p.num_processo 
                         and d3.cod_servidor not in(select cod_servidor from servidor)
                         and d3.id_vinc in (select  max(d4.id_vinc) from distrib_vincjud d4 
                  where d4.num_processo = d3.num_processo and d4.data_vinc <= M.arq_data )))
and M.COD_UNIDADE in (select M.COD_UNIDADE   from movimentacao m2 where 
(m2.cod_ORIGEM_MOV = '26000181' or m2.cod_ORIGEM_MOV = '2600000X')and m2.num_processo = p.num_processo)
and p.tipo = 'J'
and  M.arq_data  >= '2011-08-01 00:00:00'AND M.arq_data  <='2011-08-31 23:00:00'

【问题讨论】:

  • allowing change m.arq_data and m2.arq_data values 是什么意思?
  • select * FROM the_view WHERE m.arq_data = X AND m2.arq_data = Y
  • 他的意思可能是允许两列可变

标签: sql tsql sql-server-2008 view subquery


【解决方案1】:

视图不能接受参数。将其实现为表值 udf(或存储过程)。

【讨论】:

【解决方案2】:

如果您要定义视图以适应 m2.arq_data BETWEEN '2011-08-01 00:00:00'AND '2011-08-31 23:00:00' 等条件的更改日期,那么这取决于您的要求。

例如,如果此日期范围始终为 between today and 31 days from now,那么您可以将此行更改为如下所示:

m2.arq_data BETWEEN GetDate() AND DATEADD (dd, 31, GetDate())

如果日期范围不是可以使用 SQL 进行一般定义的相当简单的东西,那么您可能需要考虑使用存储的 proc 或 udf 并将日期参数传递给它。

【讨论】:

  • 应该是 DATEADD(MM, 1, GETDATE()) ;)
猜你喜欢
  • 2011-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-23
  • 2012-09-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多