如何在视图中使用子查询?

时间:2011-09-12 19:23:58

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

我需要为此查询创建查看允许更改 m.arq_data m2选择使用此查看时的.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'

2 个答案:

答案 0 :(得分:1)

查看无法获取参数。将其实现为表值udf(或存储过程)。

答案 1 :(得分:1)

如果您要定义视图以使用更改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一般定义,那么您可能需要考虑使用存储过程或udf并将日期参数传递给它。