Sql server c中SQL Server查询中的不明确列名id

Sql server c中SQL Server查询中的不明确列名id,sql-server,tsql,Sql Server,Tsql,此查询在数据库中正确执行,但在程序中出现错误?使用表别名和正确的联接语法: select Gid, Class, GroupName from Class, Group1 where Class.Gid = Group1.Gid 不明确的列是Gid,因为它存在于两个表中,但在选择列表中被引用,而没有指定应从哪个表中提取它 为了便于阅读,最好使用多个字符作为别名。因此,从长远来看,cl和gr比c和g更好。问题在于Class和Group1都有GID属性。使用别名

此查询在数据库中正确执行,但在程序中出现错误?

使用表别名和正确的联接语法:

select 
    Gid, Class, GroupName 
from 
    Class, Group1 
where 
    Class.Gid = Group1.Gid 
不明确的列是Gid,因为它存在于两个表中,但在选择列表中被引用,而没有指定应从哪个表中提取它


为了便于阅读,最好使用多个字符作为别名。因此,从长远来看,cl和gr比c和g更好。

问题在于Class和Group1都有GID属性。使用别名来区分这两个特性:

SELECT cl.Gid, cl.Class, gr.GroupName
FROM   Class cl
INNER JOIN Group1 gr
        ON cl.[Gid] = gr.[Gid];

这两个表中有相同的列,所以请给出每列的别名 像

用户内部连接,这种类型的编码是老式的

select c.Gid, c.Class, g.Gid, g.GroupName 
from Class as c
inner join Group as g on c.Gid = g.Gid
由于两个表中都存在Gid字段,因此必须指定要选择的字段。因此,使查询工作的最小更改是:

select 
       g1.Gid,
       cl.Class,
       g1.GroupName 
from 
     Class cl 
     inner join Group1 g1 
     on cl.Gid=g1.Gid 
为每个字段指定表是一个好主意,这样可以更容易地查看数据来自何处,并且使查询对表布局的更改不那么敏感。您可以使用alases防止代码被表名弄乱

此外,您应该使用join关键字来连接表,旧的连接方式在数据库引擎的更高版本中已被弃用

select Class.Gid,Class,GroupName from Class,Group1 where Class.Gid=Group1.Gid

尝试为列名本身指定别名,如下所示:

挑选 c、 Gid为'ClassGid',Class,GroupName,g.Gid为'Group1Gid' 从…起 类为c,组1为g 哪里
c、 Gid=g.Gid

i已获取class.Gid如果查询中的所有位置都使用表名或别名限定,则不可能出现不明确的列错误。尝试我发布的查询。如果仍然存在错误,则正在运行的查询不是您认为的查询。-20多年前,在ANSI-92 SQL标准中,这种旧式的逗号分隔表列表样式被正确的ANSI连接语法所取代,其使用非常简单discouraged@Oldfart是的,它们是可选的,但也是一种很好的习惯。不需要在所有要使用的位置复制完整的表名。使用像样的别名(即超过1个字母的别名)时,查询更容易阅读。我为许多人工作过,他们对可读性持完全相反的观点grounds@Oldfart嗯,在某种程度上,这只是一种偏好,但我有点想提出,在任何地方使用完整的表名都会导致糟糕的表命名约定或糟糕的表别名命名约定;-。我曾在大型复杂系统上工作过,这些系统具有不神秘但也不短的表名和别名,这些表名和别名通常是首字母缩略词,比在查询中重复50次的15-20个字符的表名可读性强得多;-@Oldfart我在最后一条评论的结尾所说的是:如果我使用的是像GD_QTR_RSLT这样的神秘表名,那么我可能更喜欢表名。但话说回来,考虑到表命名约定是多么可怕,我可能仍然更喜欢使用别名,例如results;-。
select
  c.Gid,
  g.Class,
  g.GroupName
from
  Class c
  inner join Group1 g on c.Gid = g.Gid