2013-12-13 22 views
4

我有以下存儲過程(MS SQL):「x」在查詢中的含義是什麼?

SET NOCOUNT ON 

DECLARE @Cuantos INT 

IF EXISTS 
    (
     SELECT TOP 1 * FROM IntProgramas WHERE cod_programa IN 
     ( SELECT cod_programa FROM IntGrupo_programa WHERE cod_grupo IN 
      ( SELECT cod_grupo FROM IntUsuarios WHERE cod_usuario = @cod_usuario 
      ) 
     ) 
    ) 
BEGIN 
    SET nocount ON 

      SELECT P.cod_programa 
        ,nb_programa 
        ,descripcion 
        ,secuencia 
        ,P.Accion 
        ,P.Controlador 
        INTO #mitabla1 
      FROM IntProgramas P 
      WHERE P.cod_programa  
      IN (
        SELECT cod_programa FROM Intgrupo_programa WHERE cod_grupo IN 
        (
        SELECT cod_grupo FROM Intusuarios WHERE [email protected]_usuario 
        ) 
       ) 

      SET nocount ON 

      SELECT GP.cod_programa 
      ,P.nb_programa 
      ,P.descripcion  
      INTO #mitabla2 
      FROM IntGrupo_Programa GP 
      JOIN Intprogramas P on GP.cod_programa = P.cod_programa 
      WHERE GP.cod_grupo IN (SELECT cod_grupo FROM Intusuarios WHERE [email protected]_usuario 
      SELECT @Cuantos = COUNT(*) 
      FROM(SELECT nb_programa, descripcion FROM IntProgramas 
      WHERE cod_programa in (select cod_programa from #mitabla1 
      union select cod_programa from #mitabla2))x 

      /*si existe en ambas macheo*/ 
      SELECT nb_programa, descripcion, P.cod_programa 
      INTO  #mitabla3 
      FROM  IntProgramas P 
      WHERE cod_programa in (SELECT cod_programa FROM #mitabla1 
      union SELECT cod_programa FROM #mitabla2) 

      select 
        t.nb_programa 
        , t.descripcion 
        , t.cod_programa 
        , p.secuencia 
        , ISNULL(et.cod_menu,0) as cod_menu 
        , ISNULL(et.desc_menu,0) as desc_menu 
        , ISNULL(et_sprog.cod_sub_menu_programa,0) AS cod_sub_menu_programa 
        , ISNULL(et_sprov.desc_sub_menu,0) AS desc_sub_menu_N2 
        , p.Accion 
        , p.Controlador 
      from #mitabla3 t 
      JOIN  IntProgramas p 
       ON t.cod_programa = p.cod_programa 

      LEFT JOIN IntEstructura_sub_menu_programa et_sprog 
       ON t.cod_programa = et_sprog.cod_programa 

      LEFT JOIN IntEstructura_menu_Usuarios et 
       ON et_sprog.cod_menu = et.cod_menu 

      LEFT JOIN IntEstructura_sub_menu_Usuarios et_sprov 
       ON et_sprog.cod_sub_menu_programa = et_sprov.cod_sub_menu 

      WHERE et_sprog.cod_programa IS NOT NULL 

      order by et.cod_menu, et_sprog.cod_sub_menu_programa, p.secuencia 
      --gp.cod_grupo, 

      drop table #mitabla1 
      drop table #mitabla2 
      drop table #mitabla3 


END 

我試圖去理解它,但是當我站上罰球線

union select cod_programa from #mitabla2))x 

我不明白的X做什麼任何幫助都會有所幫助。 我一直試圖運行SP部分以更好地理解流程,但該行對我來說真的很複雜。

+2

這不是一個運營商。 'SELECT(DerivedQuery)x'和'.. SELECT(DerivedQuery)AS x'是等價的。 'AS'關鍵字是可選的,正如空格。 – user2864740

+0

如果proc的作者使用比「x」更具描述性的別名,它可能會更明顯, – valverij

回答

2

X是子查詢結果的別名。應該真正做到了空間,它雖然

3

這是子查詢的別名前:

select @Cuantos = COUNT(*) 
from (
    select nb_programa, descripcion 
    from IntProgramas 
    where cod_programa in (
     select cod_programa 
     from #mitabla1 

     union 

     select cod_programa 
     from #mitabla2 
    ) 
) x 

當你做SELECT FROM (SELECT...你命名的子查詢/派生表。

它的工作原理,如果你是這樣做的:

select @Cuantos = COUNT(*) 
    from x 

不像在表名的別名大多采用以使其更易於讀取或不必重複表名,在這種情況下,別名是強制性的。

5

X是該子查詢或派生表的別名:

(SELECT nb_programa, descripcion FROM IntProgramas 
      WHERE cod_programa in (select cod_programa from #mitabla1 
      union select cod_programa from #mitabla2)) 
相關問題