【问题标题】:Explain the reason for Ambiguous column error in SQL Server 2008解释 SQL Server 2008 中出现歧义列错误的原因
【发布时间】:2013-12-30 11:29:56
【问题描述】:

我有一张桌子Business_Unit

business_unit_id int area_code nvarchar(100) region_code nvarchar(100) sub_region_code nvarchar(100)

里面有一些值。

查询一:

select 
    business_unit_id,* 
from 
    business_unit 
order by 
    business_unit_id desc

当我查询这个时,我得到以下错误。

消息 209,第 16 级,状态 1,第 1 行
不明确的列名称“business_unit_id”。

为了解决这个问题,我将表的别名用作 bu,并在列前加上别名。

select 
    bu.business_unit_id, * 
from 
    business_unit bu 
order by 
    bu.business_unit_id desc

即使下面的查询也有效。

select 
    bu.business_unit_id, bu.* 
from 
    business_unit bu 
order by 
    bu.business_unit_id desc

我想知道,为什么它抛出错误 [business_unit_id],查询“查询 1”。这里没有歧义,我只有一张桌子。

你能解释一下吗?


问这个问题的原因。 我有一个 120 列的表(假设是 bigtable),现在,我想通过 90 列来订购它。我无法滚动并检查该值,因此我将 select 90thcolumn,* from bigtable order by 90thcolumn。


【问题讨论】:

  • 你确定Business_UnitTable 而不是View ???
  • 100% ,它是一张桌子 :)
  • 好问题。即使这项工作,选择 col2,* from tbl1 order by tbl1.col2 .so 这有什么区别伙计们?你如何解释这个?
  • 请看一下我已经更新了我的答案,并提供了更多解释,我希望这会清除乌云:)
  • 对于我来说,如果我有一张大桌子,如果我想按第 90 列排序,当然,如果我不想滚动,我会将第 90 列作为选择查询中的第一列并按第一列排序。这是查询。选择 90thcolumn,* from bigtable order by 1 desc。(我再次从其中一个回复中得到答案)。谢谢大家。

标签: sql-server


【解决方案1】:

是的,我想我已经为这种奇怪的行为找到了一些解释

如果你只做这样的事情

SELECT Column1, * FROM Table_Name  

这应该可以正常工作。

但是当你做类似的事情时

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.

它会抛出一个错误,因为 Column1 在您的 SELECT Query 中被 SELECTED 两次,并且 SQL Server 想知道您希望按哪个列排序 Results 。

模棱两可的列在您的 Order by 子句中,但不在您的 Select 语句中。

进一步说明

为了进一步证明我的观点,以下是 SQL 指令的执行顺序。

  1. FROM 子句

  2. WHERE 子句

  3. GROUP BY 子句

  4. HAVING 子句

  5. SELECT 子句

  6. ORDER BY 子句

如您所见,SELECT 运算符在 ORDER BY 子句之前执行。因此,在您的情况下,SELECT 子句将有两个具有相同名称的列,当涉及到 ORDER BY 结果时,SQL Server 想知道在您的 ORDER BY 中使用哪一列,它会抛出Ambiguous column 的错误。

与别名一起使用时,歧义得到解决,您不会再收到错误。

【讨论】:

  • 谢谢。赞成。 select bu.business_unit_id, bu.* from business_unit bu order by bu.business_unit_id desc。上面的查询仍然不明确,但在这种情况下不会引发错误。一位回答的人告诉我们,我们可以通过使用别名来欺骗 SQL Server。当使用别名时,SQL Server 不关心。
  • 对于我来说,如果我有一张大桌子,如果我想按第 90 列排序,当然,如果我不想滚动,我会将第 90 列作为第一行并按第一列排序。这是查询。选择第 90 列,* from bigtable order by 1 desc。(我再次从其中一个回复中得到答案)
【解决方案2】:

那是因为您使用的是返回所有行的* 通配符。将您的查询更改为...

Select * from business_unit order by business_unit_id desc;

顺便说一句,你实际上可以通过使用别名来“欺骗”sql server

【讨论】:

  • 我有一个 120 列的表,现在,我想按 90 列排序。我无法滚动并检查值,因此我输入,选择第 90thcolumn,* from bigtable order by 90thcolumn。
  • 你说的很有道理。您的选择是...在第二个查询中使用别名,或者只返回您感兴趣的列
【解决方案3】:

由于 order by 子句,您收到错误 Ambiguous column name 'business_unit_id'。 sql server 允许在查询中包含两个具有相同名称的列(无连接)。

因此 order by 子句在排序时无法识别要使用的列,因为它能够看到两个具有相同名称的列。

【讨论】:

    【解决方案4】:

    @M.Ali 的回答很好地解释了这个问题,一种解决方法是只为列设置别名,无需为整个表设置别名:

    select 
        business_unit_id bid,* 
    from 
        business_unit 
    order by 
        business_unit_id desc
    

    【讨论】:

      猜你喜欢
      • 2010-10-04
      • 2014-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多