这是前几天论坛上问作业调度语句写法时得到的正确答案:
select identity(int,1,1) as tempID,yonghuID into #a from (select top 100 percent yonghuID from [employerzhuce] order by koubei desc) t
select identity(int,1,1) as tempID,yonghuID into #b from (select top 100 percent yonghuID from [employerzhuce] order by yizhifu desc) t
select identity(int,1,1) as tempID,t.yonghuID into #c from (select top 100 percent #a.yonghuID from #a inner join #b on #a.yonghuID=#b.yonghuID order by (#a.tempID+#b.tempID) asc) t当时问了最后的t是给前面搜索集定义的一个名称,但是只有最后一句用到了t.yonghuID,前面2句都直接用的yonghuID,这是为什么,我试过把1,2句最后的T删掉,但是要报错,难道1,2句里面定义的t跟第三句里面t.yonghuID有关系么?而第三句定义的t跟前面2句的不是同一个集啊

解决方案 »

  1.   

    沒關係
    第三句T是(select top 100 percent #a.yonghuID from #a inner join #b on #a.yonghuID=#b.yonghuID order by (#a.tempID+#b.tempID) asc) 別名
      

  2.   

    MSSQL表别名使用注意事项 
    1.在SQL语句中一旦指定了表别名,则不能再使用"表名称.列名"格式,只能使用"表别名.列名"格式来引用列.2.在SQL主句中使用子查询中的列时,必须为子查询指定一个表别名,然后以"表别名.列名"的格式来应用子查询中的列.当SQL主句的FROM子句仅为一个子查询时,必须为该子查询指定一个表别名,否则SQL语句无法执行.例如:
    SELECT ID FROM (select e.ID from employee as e  where (e.年度 = 2000) AND (e.月份 = 3))
    提示: ')' 附近有语法错误。正确的应该为:
    SELECT ID FROM (select e.ID from employee as e  where (e.年度 = 2000) AND (e.月份 = 3)) AS X3.子查询中使用了"表别名.列名"来引用列时,若此表别名在子查询和SQL主句中都不存在,则导致SQL语句无法执行.例如:
    SELECT ID FROM (select e.ID from employee  where (e.年度 = 2000) AND (e.月份 = 3)) AS X
    提示: 列前缀 'e' 与查询中所用的表名或别名不匹配。
    如果SQL主句中存在此表别名,则错误不会发生,但会导致无法预料的结果(通常导致该子查询返回结果为空).例如:
    SELECT e.* FROM (select * from sales as e where (e.年度 = 2006) and (e.月份 = 3)) AS e 
    WHERE (e.员工号 NOT IN (select e.员工号 from sales  where (e.年度 = 2000) AND (e.月份 = 3)))
    此SQL语句执行后,导致主句的WHERE子句的子查询返回空值,使WHERE子句结果为真,筛选实效.
    正确的为:
    SELECT e.* FROM (select * from sales as e where (e.年度 = 2006) and (e.月份 = 3)) AS e 
    WHERE (e.员工号 NOT IN (select e.员工号 from sales as e where (e.年度 = 2000) AND (e.月份 = 3)))
      

  3.   

    对啊 所以我把1,2句的t去了,按确定的时候SQL提示我有语法错误,错误156 select附近有错误?
      

  4.   

    t.yonghuID --这个t可以省略
    但最后的t不能省略,那个是数据集的别名,
      

  5.   


    那个t是 (select top 100 percent yonghuID from [employerzhuce] order by koubei desc) 得到的结果集的别名,不能去掉,
      

  6.   

    引用结果集那里不能去掉别名,也就是括号后面,这是语法规定
    至于你列里用不用,如果只是一个结果集,用不用都可以
    如果你这个T结果集又和其他表关联,而其他表的字段和T里面的字段重复,你在引用列
    的时候,就要加上t.字段名来区分,这样说,你明白了吧.