Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何对多个表使用SQL联接操作_Sql_Sql Server_Join - Fatal编程技术网

如何对多个表使用SQL联接操作

如何对多个表使用SQL联接操作,sql,sql-server,join,Sql,Sql Server,Join,假设有7个这样的表: Teacher: Class: Lesson: Number of students: Filled in: Survey_question: t1 c1 math 90 54 question1? 班级教师课程 class_teacher_lession_ID, class_ID, teacher_ID, lesson_ID lesson_ID, lesson

假设有7个这样的表:

Teacher:  Class:   Lesson:  Number of students:  Filled in:    Survey_question:
t1        c1       math     90                   54            question1?
班级教师课程

class_teacher_lession_ID, class_ID, teacher_ID, lesson_ID
lesson_ID, lesson
survey_question_ID, survey_question, 
课程

class_ID, class
老师

teacher_ID, teacher
survey_answer_ID, survey_question_ID, class_teacher_lession_ID, survey_answer
课程

class_teacher_lession_ID, class_ID, teacher_ID, lesson_ID
lesson_ID, lesson
survey_question_ID, survey_question, 
学生

student_ID, class_ID, ..., ....
调查\u答案

teacher_ID, teacher
survey_answer_ID, survey_question_ID, class_teacher_lession_ID, survey_answer
调查问题

class_teacher_lession_ID, class_ID, teacher_ID, lesson_ID
lesson_ID, lesson
survey_question_ID, survey_question, 
结果应该是这样的:

Teacher:  Class:   Lesson:  Number of students:  Filled in:    Survey_question:
t1        c1       math     90                   54            question1?
我将通过一个循环得到这个:

数学课:

survey_question (where teacher_id = 11 and lesson_id = 13):
Total Students            Total Students Answered Survey         survey_answer AVG
     155                                45                              79%

survey_question 2 (where teacher_id = 11 and lesson_id = 13):
Total Students            Total Students Answered Survey         survey_answer AVG
     155                                99                              87%
第二课英语:

survey_question (where teacher_id = 11 and lesson_id = 15):
Total Students            Total Students Answered Survey         survey_answer AVG
     90                                20                              50%

survey_question 2 (where teacher_id = 11 and lesson_id = 15):
Total Students            Total Students Answered Survey         survey_answer AVG
     90                                25                              34%
到目前为止,我已经尝试过:

SELECT teacher AS 'Teacher', class AS 'Class', lesson AS 'Lesson',
COUNT(student_ID) AS 'Number of students',
COUNT(enquete_antwoord_ID) AS 'Total students answered survey', 
enquete_vraag AS 'Survey Question'
FROM Teacher
LEFT JOIN class_teacher_lesson
ON teacher.teacher_ID = class_teacher_lesson.teacher_ID
LEFT JOIN lesson
ON class_teacher_lesson.class_ID = lesson.lesson_ID
LEFT JOIN class
ON class_teacher_lesson.class_ID = class.class_ID
LEFT JOIN student
ON class.class_ID = student.class_ID
LEFT JOIN survey_answer
ON class_teacher_lesson.class_teacher_lesson_ID = 
survey_answer.class_teacher_lesson
LEFT JOIN survey_question
ON survey_answer.survey_question_ID = survey_question.survey_question_ID
WHERE teacher.teacher_ID = '1158' AND lesson.lesson_ID = '449'
GROUP BY class.class, lesson.lesson, teacher.teacher,
survey_answer.survey_answer, survey_question
根据这一结果:

Teacher:  Class:   Lesson:  Number of students:  Filled in:    Survey_question:
t1        c1       math     54                   54            question1?
t1        c1       math     24                   0             NULL
t1        c1       math     22                   0             NULL
结果应该是这样的:

Teacher:  Class:   Lesson:  Number of students:  Filled in:    Survey_question:
t1        c1       math     90                   54            question1?

我假设您的选择中的
enquete\u vraag
和您的问题中的
survey\u question
实际上是同一列,这只是翻译中遗漏的内容(否则查询将无法选择不在group by中的列)

在这种情况下,您实际上需要做的就是从GROUPBY子句中删除
survey\u-answer.survey\u-answer
(您还可以将一些左侧联接更改为INTERNAR,这可以提高性能)

但是(尽管这完全是主观的)我建议使用表别名清理查询,也不要使用单引号来标识列别名(以避免与文字混淆),而且(这更主观)我添加了SQL Server特有的
Alias=column\u name
语法,我个人认为这更具可读性()

这两种解决方案应该得到相同的结果,我并不是想把我的偏好强加给任何人,我只是提出一些选择。这只是一个偏好的问题,你会发现哪个更具可读性

编辑

我认为,由于将多个“一-多”关系连接到同一个“一”,这导致了无效的调查问题,因此您正在获得交叉连接。我认为将聚合移动到子查询可能会有所帮助:

SELECT  t.teacher, 
        c.class, 
        l.lesson,
        [Number of students] = ISNULL(s.Students, 0),
        [Total students answered survey] = ISNULL(sq.Answers, 0), 
        sq.SurveyQuestion,
        [% Students Answered] = 100.0 * ISNULL(sq.Answers, 0) / NULLIF(s.Students, 0)
FROM    Teacher t
        INNER JOIN class_teacher_lesson ctl
            ON t.teacher_ID = ctl.teacher_ID
        INNER JOIN lesson l
            ON ctl.class_ID = l.class_ID
        INNER JOIN class c
            ON ctl.class_ID = c.class_ID
        LEFT JOIN 
        (   SELECT  Class_ID, Students = COUNT(*)
            FROM    student s
            GROUP BY Class_ID
        ) S
            ON c.class_ID = s.class_ID
        LEFT JOIN 
        (   SELECT  sa.class_teacher_lesson_ID, 
                    sq.SurveyQuestion,
                    Answers = COUNT(*)
            FROM    survey_answer sa
                    LEFT JOIN survey_question sq
                        ON sa.survey_question_ID = sq.survey_question_ID
            GROUP BY sa.class_teacher_lesson_ID, sq.SurveyQuestion
        ) sq
            ON ctl.class_teacher_lesson_ID = sq.class_teacher_lesson_ID
WHERE   t.teacher_ID = '1158' 
AND     l.lesson_ID = '449';

请写下你迄今为止所做的努力。您可以在
Sql
查询中使用带有适当
Where
条件的
Join
操作。可能对你有帮助。或者试着读一下,你真正的问题是什么?您是否尝试过某项操作并遇到错误?你有没有尝试过一些东西却没有得到你期望的结果?你甚至不知道从哪里开始?我知道标题中有一个问题,但实际上标题应该表明您的一般问题,您的问题需要详细说明您的问题的细节。目前,您可能得到的答案只是对您面临的问题的猜测,而不是实际解决您的问题,并(希望)向您展示如何在将来解决类似问题。@wxyz I更新了question@KishanSarsechaGajjar我更新了问题MSG 209,16级,状态1,第19行不明确的列名“enquete_vraag_ID”。Msg 207,第16级,州1,第19行无效列名“总计学生答案调查”。Msg 207,级别16,状态1,第19行无效列名“total_student”。在SQL Server中,您不能通过别名引用选择列表中的表达式,必须重复该表达式。已删除别名。你能检查一下更新的oneNice jats吗,仍然有第一个错误:Msg 209,16级,状态1,第40行模棱两可的列名“survey\u question\u id”你可以在分组中添加sq.survey\u question\u id..抱歉遗漏了一些小东西谢谢你的回复不幸的是,我没有收到任何没有错误的回复msg.ON ctl.class\u id=l.lesson\u id=l.Lessure\u id内部连接类c ON ctl.class\u id=c.class\u id这是错误的,但我仍然没有得到正确的回复结果5行事实上,我从GROUPBY和select中删除了类,但现在我在这里得到了两行输出:您使用的是什么DBMS?这个问题被标记为SQL Server和MySQL,现在两者都没有。我使用SQL Server作为DBMS,而且学生填写的必须是1,因为在调查的答案中只有1行。