【问题标题】:Need help on ambiguous column name需要关于不明确的列名的帮助
【发布时间】:2020-04-21 19:34:40
【问题描述】:

我有这个 SQL 代码:

CREATE TABLE STUDENT
(
    sid int PRIMARY KEY,
    sname varchar(20) NOT NULL,
    saddress varchar(20) NOT NULL
)

CREATE TABLE COURSE
(
    cid int PRIMARY KEY,
    cname varchar(20) NOT NULL,
    ccredit int NOT NULL
)

CREATE TABLE REGISTER
(
    eid int PRIMARY KEY,
    sid int NOT NULL,
    cid int NOT NULL,
    edate date NOT NULL,

    FOREIGN KEY (sid) REFERENCES STUDENT (sid) 
            ON DELETE CASCADE ON UPDATE CASCADE,
    FOREIGN KEY (cid) REFERENCES COURSE (cid) 
            ON DELETE CASCADE ON UPDATE CASCADE
)

但是当我想显示注册“数据库”主题的学生的全部详细信息时,我收到以下错误:

消息 209,第 16 级,状态 1,第 11 行
不明确的列名“sid”

消息 209,第 16 级,状态 1,第 11 行
不明确的列名“cid”

这是查询代码,谁能告诉我我在这里做错了什么?

SELECT eid, edate, cname, sname, saddress, sid, cid
FROM register r
JOIN course c ON c.cid = r.cid
JOIN student s ON r.sid = s.sid
WHERE cname = 'database';

【问题讨论】:

  • 始终限定所有列是一种很好的编程习惯,至少在涉及多个表时是这样。就像r.sid 而不是sid
  • 好的,我试试这个

标签: sql sql-server


【解决方案1】:

这些列名存在于您从中选择数据的多个表中,因此查询引擎不知道您要使用哪个表。您可以在 SELECT 子句中手动指定它,方法是在表(或别名)名称前添加:

SELECT
  eid,
  edate,
  cname,
  sname,
  saddress,
  s.sid,
  c.cid
FROM register r
JOIN course c ON c.cid = r.cid
JOIN student s ON r.sid = s.sid
WHERE cname = 'database'

【讨论】:

    【解决方案2】:

    您在注册表和课程表中都有一个名为 cid 的列。该错误只是说明解析器不知道您想要哪一列。您需要在 select 语句中使用正确的别名作为列名的前缀。 r.cid 用于注册表或c.cid 用于课程表

    【讨论】:

      猜你喜欢
      • 2014-09-25
      • 1970-01-01
      • 2014-03-11
      • 2017-08-05
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-06
      相关资源
      最近更新 更多