【问题标题】:(Access) Sql Statement Using 3 tables(访问)使用3张表的Sql语句
【发布时间】:2016-01-29 04:03:35
【问题描述】:

这是我第一次使用 StackOverflow,我正在学习 SQL,但在连接等方面遇到了问题。今天我有一个挑战。

好的,下面是表格:

STUDENT
Student_ID Instructor_ID Adviser_ID
2          9723          9945
7          9723          9723
8          9801          9945
17         9945          9945
19         9624          9945
21         9723          9723

INSTRUCTOR
Instructor_ID Person_ID
9624          14
9723          15
9801          11
9945          16

PERSON
Person_ID  Person_First_Name  Person_Last_Name
1          Jim                Johnson
2          John               Doe
...
11         Chuck              John
...
14         Joanne             Jackson
15         Steven             Pruck
16         Scott              Buttermilk
... (Possibly More Records)

我试图获取的 SQL 查询是每个学生的讲师的姓名和作为他们顾问的讲师的姓名。格式如下:

Student_ID | Instructor's First and Last Name | Adviser's First and Last Name

另请注意,advisor_ID 与instructor_ID 相同。到目前为止,这是我想出的,但更进一步,我认为我需要两个内部连接或一些子查询:

SELECT STUDENT.Student_ID, Person.person_first_name + " " + Person.person_last_name AS Instructor
FROM STUDENT AS S, PERSON AS P, INSTRUCTOR AS I
WHERE S.Instructor_ID = I.Instructor_ID
AND I.person_ID = P.person_ID
ORDER BY S.Student_ID;

编辑:这是用于 Microsoft Access 数据库(以防万一)

【问题讨论】:

  • INSTRUCTOR 表的用途是什么?似乎学生和教师之间的关系已经在STUDENT 表中处理。
  • instructor Table 用于查找 Person_ID,您需要它才能在 Person 表中找到 Person 的姓名。
  • 仍在寻找正确答案,因为我不相信这些对我有用。
  • 我认为问题出在您的架构上,它没有被规范化。 INSTRUCTOR 表在我看来是多余的,你可以不用它。答案正在尝试使用您给我们的内容。

标签: sql ms-access join relational-database inner-join


【解决方案1】:

试试这个方法

 SELECT S.Student_ID, P.person_first_name + " " + P.person_last_name AS Instructor, P1.person_first_name + " " + P1.person_last_name AS Adviser
    FROM STUDENT AS S, 
    inner join INSTRUCTOR AS I on S.Instructor_ID = I.Instructor_ID
    inner join PERSON AS P on I.person_ID = P.person_ID
    inner join INSTRUCTOR AS I1 on S.Adviser_ID = I1.Instructor_ID
    inner join PERSON AS P1 on I1.person_ID = P1.person_ID
ORDER BY S.Student_ID;

【讨论】:

  • 不知道您可以多次从同一张表中拉出并称其为其他名称。这对我帮助最大,即使我无法让您的查询最终发挥作用。
  • @JimJohnson 你想要展示顾问,所以顾问加入第二张桌子。如果是同一张表不显示结果。
【解决方案2】:
SELECT STUDENT.Student_ID, Person.person_first_name + " " + Person.person_last_name AS Instructor , P.person_first_name + " " + P.person_last_name AS Adviser
FROM STUDENT AS S 
JOIN INSTRUCTOR AS I ON I.Instructor_ID = S.Instructor_ID
JOIN PERSON AS P ON P.Person_ID = I.Person.ID
ORDER BY S.Student_ID;

【讨论】:

    【解决方案3】:

    这对两个student 字段(instructor_idadviser_id)使用了两次查找:

    select student_id,
        (select concat(person_first_name, ' ', person_last_name)
         from instructor i
             inner join person p on i.person_id=p.person_id
         where i.instructor_id=student.instructor_id) instructor,
        (select concat(person_first_name, ' ', person_last_name)
         from instructor i
             inner join person p on i.person_id=p.person_id
         where i.instructor_id=student.adviser_id) advisor
    from student
    

    你可以在这里看到它的实际效果:http://sqlfiddle.com/#!9/13b07e/3

    【讨论】:

      【解决方案4】:

      这就是我最终要做的工作:

      SELECT S.Student_id, P.person_first_name+" "+P.person_last_name AS Instructor, P1.person_first_name+" "+P1.person_last_name AS Adviser
      
      FROM Student AS S, PERSON AS P, Instructor AS I, Person AS P1, Instructor AS I1
      WHERE S.Instructor_ID = I.Instructor_ID 
      AND I.person_ID = P.person_ID
      AND S.Adviser_ID = I1.Instructor_ID
      AND I1.person_ID = P1.person_ID
      ORDER BY S.Student_id;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-05
        • 1970-01-01
        • 1970-01-01
        • 2015-07-26
        • 1970-01-01
        • 1970-01-01
        • 2021-09-10
        • 1970-01-01
        相关资源
        最近更新 更多