对于学校作业,我必须创建一个数据库并运行报告。我创建了代码,一位同学也创建了代码,它运行相同的东西,但他的格式我没见过,也不太理解。
这是我的:
SELECT
Course.Name AS 'Course Name',
Program.Name AS 'Program Name'
FROM
Course, Program, ProgramCourse
WHERE
ProgramCourse.CourseID = Course.ID
AND
ProgramCourse.ProgramID = Program.ID
GO
这是他的:
CREATE VIEW NumberOfCoursePerProgram AS
SELECT
p.name AS ProgramName,
c.name AS CourseName
FROM
Program p
JOIN
ProgramCourse pc ON pc.ProgramID = p.ID
JOIN
Course c ON c.ID = pc.CourseID
GO
我使用我创建的表中的数据运行了这两个查询。它们返回的结果几乎相同,只是顺序略有不同,但它满足了作业问题。无论如何,如果我从他的代码中删除Program p
中的p
,它会返回一个错误
The multi-part identifier "p.name" could not be bound.
那么当我还没有建立这些变量时,SQL Server 如何能够接受 p.name
和 p.ID
等呢?我不太明白代码在他的身上是如何工作的。我的看起来简单明了,我绝对明白那里发生了什么。那么有人可以解释一下他的吗?
谢谢
最佳答案
有一些差异。首先,他创建了一个 VIEW
而不仅仅是一个 select 语句:
CREATE VIEW NumberOfCoursePerProgram AS
创建 View 后,您可以像查询表一样查询 View :
SELECT * FROM NumberOfCoursePerProgram;
其次,他使用的是 ANSI JOIN,而不是隐式 JOIN。他的方法更现代,而且按照今天的标准,很可能被认为更正确:
JOIN ProgramCourse pc ON pc.ProgramID = p.ID
JOIN Course c ON c.ID= pc.CourseID
而不是:
FROM Course, Program, ProgramCourse
另外,请注意他正在分配 table aliases当他引用表格时:
FROM Program p
末尾的 p
允许您替换 p
,而不是在查询中的其他位置指定 Program
的整个表名称。例如,您现在可以说 WHERE p.Foo > 5
而不是 WHERE Program.Foo > 5
。在这种情况下,它只是一个快捷方式并保存一些字符。但是,假设您两次引用同一个表(例如,在同一个表的两个不同行中进行 JOIN)。在这种情况下,您可能必须为每个表提供别名,以区分哪个表是哪个表。
关于sql - SQL Server 代码之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20081119/