我有一张桌子Business_Unit:
business_unit_id int
area_code nvarchar(100)
region_code nvarchar(100)
sub_region_code nvarchar(100)
它有一些价值.
查询1:
select
business_unit_id,*
from
business_unit
order by
business_unit_id desc
Run Code Online (Sandbox Code Playgroud)
当我查询这个时,我收到以下错误.
消息209,级别16,状态1,行1
不明确的列名称'business_unit_id'.
为了解决这个问题,我使用了表的别名作为bu,并在列中添加了别名作为前缀.
select
bu.business_unit_id, *
from
business_unit bu
order by
bu.business_unit_id desc
Run Code Online (Sandbox Code Playgroud)
即使以下查询也可以.
select
bu.business_unit_id, bu.*
from
business_unit bu
order by
bu.business_unit_id desc
Run Code Online (Sandbox Code Playgroud)
我想知道,为什么它抛出错误[business_unit_id],查询"查询1".这里没有歧义,我只有一张桌子.
你可以解释吗?
问这个问题的原因.我有一个120列表(假设bigtable),现在,我想通过说90列来命令它.我无法滚动并检查值,因此我将选择90thcolumn,*从bigtable order by 90thcolumn.
对,我想我已经找到了一些解释这种奇怪的行为
如果你只做这样的事情
SELECT Column1, * FROM Table_Name
Run Code Online (Sandbox Code Playgroud)
这应该可行.
但是当你做某事时
SELECT Column1, * FROM Table_Name
ORDER BY Column1 --<-- this Column1 is contained in `*` as well as in the SELECT
-- statement too, SQL Server needs to know which one to use
-- in your order by clause.
Run Code Online (Sandbox Code Playgroud)
它会抛出一个错误,因为在您的SELECT查询中,Column1被SELECTED两次,并且SQL Server想知道您希望通过哪个列按结果排序.
不明确的列位于Order by子句中,但不在Select语句中.
进一步说明
进一步证明我的观点以下是SQL指令执行的顺序.
FROM子句
WHERE子句
GROUP BY子句
HAVING子句
SELECT子句
ORDER BY子句
如您所见,SELECT运算符在ORDER BY子句之前执行.因此,在你的情况下,SELECT子句将有两个具有相同名称的列,当涉及到ORDER BY结果时,SQL Server想要知道在ORDER BY中使用哪个列,它会抛出错误Ambiguous column.
与别名一起使用时,Ambiguity已解决,您不会再遇到错误.