“)x”在查询中的含义是什么?

时间:2013-12-13 21:58:58

标签: sql sql-server tsql

我有以下存储过程(在MS SQL中):

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 cod_usuario=@cod_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 cod_usuario=@cod_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以更好地理解流程,但这条线对我来说真的很复杂。

3 个答案:

答案 0 :(得分:5)

X是此子查询或派生表的别名:

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

答案 1 :(得分: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

与表名中的别名不同,表名主要用于使其更易于阅读或不必重复表名,在这种情况下,别名是必需的。

答案 2 :(得分:2)

X是子查询结果的别名。虽然

之前应该有一个空间