用于连接5个表的SQL语句

时间:2012-12-13 23:39:13

标签: c# asp.net sql

好的,所以我想用一个相当复杂的语句填充gridview,我不知道怎么弄,我甚至不知道它是否可能。涉及五个表和一个视图,这些不是表中的所有字段,只是为了使事情更清楚,我只放置必需的字段。

学生表: -

Student_ID
Specialization_ID

专业化表: -

ID
Specialization_Name
Department_ID

员工表: -

ID
Staff_ID 
Department_ID

部门表: -

ID
Department_Name

调查表: - (Username是上传者)

ID
Username

用户视图: - (此处UsernamePassword取自学生表和员工表)

Username
Password
UserType

这就是我创建视图的方式: -

CREATE View [Users] as
Select Student_ID as Username, Password,'STU' as UserType from Student
union
Select Staff_ID, Password, 'STF' as UserType from Staff

现在,考虑到当一名工作人员登录时,他的用户名存储在会话Session["Username"]中,我想从数据库中提取的是用户(仅限学生)上传的所有调查属于当前用户部门的专业化。考虑到所有关系(外键)都已设置,我应该使用的是什么SQL查询?或至少是方法。

3 个答案:

答案 0 :(得分:1)

简而言之:首先尝试找出表格之间的联系(FK和PK - 对于一个起点,看起来像Specialization,Staff和Department表确实有关系。)

然后提出有效的查询。尝试将其转换为视图,并根据记录的数量来衡量性能。

虽然这是一个如何进行的准则,但我相信这会有所帮助。

答案 1 :(得分:0)

好的,所以我在磨了一个小时后用子查询解决了...谢谢大家的帮助。

    Select * From Survey where Username IN 
(Select Student_ID from Student where Specialization_ID IN 
(Select ID from Specialization where Department_ID = 
(Select Department_ID from Staff where Staff_ID =@Username)))

答案 2 :(得分:0)

我可以问为什么用户和员工之间没有另一张桌子?

它可能被称为UserStaffTable,它将两个id列作为复合键,还有两个额外的列引用专门化和departmenttable?这样,您始终拥有属于工作人员的学生列表,您可以根据专业化和/或部门对其进行过滤。

这将允许您执行连接而不是子查询。

根据这个SO answer子查询的速度较慢,如果这很重要的话。