SQL与不明确的列连接

wat*_*wat 0 sql oracle

我正在尝试连接几个表来生成具有先决条件的类列表.一切都很好,除了我需要两个类的名字前提条件和原始类.

到目前为止我有

SELECT course_name, c.course_number, course_name, prereq
FROM rearp.course c, rearp.prereq p
WHERE c.course_number = p.course_number;
Run Code Online (Sandbox Code Playgroud)

这给了我(你已经可以看到一个问题,course_name在那里两次[不知道如何处理它否则])

  • 课程名称(好的)
  • 班级(是的)
  • 课程名称再次(等同名称!)
  • 前提条件(好)

忽略格式只是注意课程名称或先决条件仅对应于原始课程而不是先决条件.

我的问题是我不能得到匹配的名字.

sir*_*ide 6

使用别名并确保始终在字段列表中包含表名:

SELECT
    c.course_name,
    c.course_number,
    p.course_name AS prereq_course_name,
    p.prereq
FROM rearp.course AS c, rearp.prereq AS p
WHERE c.course_number = p.course_number
Run Code Online (Sandbox Code Playgroud)

另外,请使用有意义的表别名而不是单个字母,并尝试使用实际连接而不是隐式连接.如果您使用MySQL,则连接将是交叉连接,这是低效且不必要的.

编辑:在字段列表中添加逗号...

  • **BTW**:这是一个实际的`INNER JOIN`但是使用不同的语法,它是ANSI SQL-89连接语法.但正如你所说,不推荐.如果删除where子句,它将是交叉连接.有关详细信息,请参阅[this](http://stackoverflow.com/questions/13289546/which-query-is-the-correct-way/13289653#13289653). (2认同)