none
两条语句一样,但执行结果却不一样? RRS feed

  • 问题

  • update employee
    set emp_id=t.rowId
    from
    (
    	select * from 
    	employee 
    	where Emp_UserName=employee.Emp_UserName
    ) as t

    the statement is executed correctly.

    but,the follow statement is wrong when it being executed,why?

    update employee set emp_id=t.rowId from ( select * from employee as t1 -- alias is t1 where t1.Emp_UserName=employee.Emp_UserName ) as t 

    消息 4104,级别 16,状态 1,第 13 行
    无法绑定由多个部分组成的标识符 "employee.Emp_UserName"。


    yanglei


    • 已编辑 Lane3000 2012年5月30日 9:20
    2012年5月30日 9:19

答案

  • ( select * from
    employee
    as t1  -- alias is t1
    where t1.Emp_UserName=employee.Emp_UserName
    ) as t

    这个的意思,是为 employee 的每条记录,去执行一次子查询,这不是 JOIN 语句支持的,CROSS APPLY 或者 OUTER APPLY 才支持

    当然,从你的目的(另一个帖子)来看,你是不应该使用 APPLY 的,是你把条件写错了位置


    2012年5月30日 9:50

全部回复

  • 看起来似乎在from后面的子查询中无法识别外层的employee,而内层的employee又已经被设定别名为t1,所以导致发生这个错误讯息。

    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/

    2012年5月30日 9:27
  • ( select * from
    employee
    as t1  -- alias is t1
    where t1.Emp_UserName=employee.Emp_UserName
    ) as t

    这个的意思,是为 employee 的每条记录,去执行一次子查询,这不是 JOIN 语句支持的,CROSS APPLY 或者 OUTER APPLY 才支持

    当然,从你的目的(另一个帖子)来看,你是不应该使用 APPLY 的,是你把条件写错了位置


    2012年5月30日 9:50
  • 第一个会正确,是因为从你的语句来看,引用的两个列其实都是子查询的列,而不是外部那个表(第二个子查询已经限制了子查询的结果集命名为 t1, 所以 employee.Emp_UserName 只能确定为是外层的那个表)

    employee
    where Emp_UserName=employee.Emp_UserName

    对于子查询而言,如果某个列名在子查询内部和外部都存在,则选择的是内部的,而不是外部的

    2012年5月30日 9:56
  • 邹建正解。

    另外,这个不叫子查询(subquery),这个叫做派生表(derived tables )。select里面的或者where exists的才是子查询。不过叫什么名字不重要。


    想不想时已是想,不如不想都不想。

    2012年5月30日 9:59
    版主
  • 谢谢各位的回复,不好意思,上面提问题sql少了RowId的定义,我的目的就是要将emp_id更新成行号

    update employee
    set emp_id=t.rowId
    from
    (
    select *,Row_Number() over(order by emp_UserName) as rowid from
    employee
    as t1  -- alias is t1
    where t1.Emp_UserName=employee.Emp_UserName
    ) as


    yanglei

    2012年5月30日 11:49