【发布时间】:2013-07-02 19:25:40
【问题描述】:
我有这个 T-SQL Server 2008 查询:
SELECT users.user_id,
course_main.course_name,
course_main.course_id
FROM users,
course_main
INNER JOIN course_application
ON users.pk1 /*(error #1)*/ = course_application.pk1
INNER JOIN course_main /*(error #2)*/
ON course_application.crsmain_pk1 = course_main.pk1
INNER JOIN course_users
ON users.pk1 /*(error #3)*/ = course_users.users_pk1
AND course_main.pk1 = course_users.crsmain_pk1
AND course_main.pk1 = course_users.child_crsmain_pk1
WHERE course_users.role = 'P'
AND ( ( course_main.course_id ) LIKE '%FA2013'
AND ( course_application.application ) = 'alrn-AtomicLearning_tool' )
AND ( ( ( course_application.enable_ind ) = 'Y'
OR ( course_application.visible_ind ) = 'N' )
OR ( ( course_application.enable_ind ) = 'N'
OR ( course_application.visible_ind ) = 'Y' ) )
所有的嵌套连接都让我头疼。我希望带有查询设计器的 SQL Server 2008 至少能够输入别名,但我想我错了。
当我在编辑器中时,我在第一次加入时收到users.pk1 的错误
无法绑定多部分标识符“users.pk1”
我也收到此错误:
FROM 子句中的对象“course_main”和“course_main”具有相同的公开名称。使用相关名称来区分它们
我对别名知之甚少,并且知道如何将它们放入 SQL 中以完成非常非常基本的任务,但我只会把自己弄糊涂到无法回头的地步。我已经阅读了有关别名的所有内容,但只是不知道在加入这个复杂的情况下在哪里正确使用它们。请帮忙!
谢谢
编辑:我不确定如何陈述我的意图。基本上,我试图从我选择的所有表中取出 3 列。为了获得正确的数据,键和表之间必须匹配的所有内容。在 SQL Server 2008 中,我选择了所有具有关系的表。在我选择的所有内容是 course_main 和 course_application 表之前,我已经运行了查询。由于它们具有直接关系,因此只需一个连接即可实现这一目标。添加这 2 个额外的表(users 和 course_users 以定义哪些用户在我们的数据库中与其他表中的键匹配为特定角色)使其变得更加复杂。
这些是四个表的架构:
【问题讨论】:
-
您正在混合导致问题的 JOIN 类型。坚持使用 ANSI sql(INNER JOIN 等)并删除
, course_main。 -
你为什么使用一个隐式连接和所有正确的连接?
-
您能否提供您要从中提取的表的完整表名列表?从查询中可以看出,您正试图从一个名为“users”的表中提取,但第一个错误意味着没有“users”表(或者它没有 pk1 字段)。
-
我需要从用户和 course_main 中提取。仅从用户中选择不会返回所有数据,对吗?我没有明确地做任何事情。我进入 Sql Server 2008 管理工作室中的数据库,并选择了我希望能够在其中使用条件并根据主键匹配从中选择数据的表。这是从数据库架构到页面的链接,它确实有一个用户表,并且肯定有一个 pk1 键,该键经常在其他表中用作外键library.blackboard.com/ref/8c156cbc-7160-4e64-9f00-f06ea67a0fe0/…
-
请注意,5 表连接不过是个怪物。
标签: sql sql-server-2008 tsql