2014-01-18 4 views
1

Я новичок в SQL и теперь изучаю объединения таблиц.SQL: Присоединиться к трем таблицам

Я застрял в соединении трех таблиц.

(Я дал строки я вставил к таблицам также для справки.)

Моих таблиц

--Table1 

    create table sql_students(
    stu_studentid int not null primary key, 
    stu_name varchar(100) not null, 
    stu_regnnumber bigint unique not null 
    ) 

--Rows inserted to Table1 

insert into sql_students (stu_studentid,stu_name,stu_regnnumber) values (1,'John',194300) 
insert into sql_students (stu_studentid,stu_name,stu_regnnumber) values (2,'Joy',959595) 
insert into sql_students (stu_studentid,stu_name,stu_regnnumber) values (3,'Lucy',474848) 

--Table2 

create table sql_exam(
exa_examid bigint not null primary key, 
exa_name varchar(100) not null, 
exa_maxmark decimal(5,2) not null, 
exa_minmarkreqdforpass decimal(5,2) not null, 
exa_examscheduletime datetime not null 
) 

--Rows inserted into Table2 

insert into sql_exam(exa_examid,exa_name,exa_maxmark,exa_minmarkreqdforpass,exa_examscheduletime) values (1,'Maths',100,40,'2012-10-10 10:00') 
insert into sql_exam(exa_examid,exa_name,exa_maxmark,exa_minmarkreqdforpass,exa_examscheduletime) values (2,'English',75,35,'2012-10-11 10:00') 

--Table3 

create table sql_studentmarks(
stm_studentid int foreign key references sql_students(stu_studentid), 
stm_examid bigint foreign key references sql_exam(exa_examid), 
stm_mark decimal(5,2) 
) 

--Rows inserted into Table3 
insert into sql_studentmarks(stm_studentid,stm_examid,stm_mark) values (1,1,80) 
insert into sql_studentmarks(stm_studentid,stm_examid,stm_mark) values (2,1,90) 
insert into sql_studentmarks(stm_studentid,stm_examid,stm_mark) values (3,1,40) 
insert into sql_studentmarks(stm_studentid,stm_examid,stm_mark) values (1,2,70) 
insert into sql_studentmarks(stm_studentid,stm_examid,stm_mark) values (2,2,60) 
insert into sql_studentmarks(stm_studentid,stm_examid,stm_mark) values (3,2,17) 

Мне нужны руководящие принципы, чтобы получить

  1. Всех студентов, сдал все экзамены
  2. Все учащиеся, которые посетили все экзамены
  3. Все учащиеся и их отличия в математике и английском языке.

Заранее спасибо.

+4

Что вы пробовали до сих пор, вам нужно показать свои усилия, чтобы мы могли помочь, а не только нужные вам запросы. – Sparky

+1

Все, что вам нужно, - это 2 предложения INNER JOIN, чтобы присоединиться к 3 таблицам. Добавьте предложение WHERE в конце для решения проблем 1, 2 и 3. Покажите нам что-то, используя то, что я сказал, и мы исправим его для вас. –

+0

Hi Sparky, для первого, я попробовал «select stm_studentid from sql_exam присоединиться к sql_studentmarks на exa_examid = stm_examid и stm_mark> exa_minmarkreqdforpass внутреннее соединение sql_students на stu_studentid = stm_studentid". Он не работал по мере необходимости. – user3209814

ответ

1

В приведенном ниже коде показаны первые два запроса. Ваш присоединяется к ОК .. Попробуйте это в SQL Fiddle, а затем посмотреть, если вы можете работать третий запрос из

Запрос # 1: (Вы были очень близки, просто нужно было отчетливое ключевое слово)

select stm_studentid,stu_name 
from sql_exam 
join sql_studentmarks on exa_examid=stm_examid 
         and stm_mark>exa_minmarkreqdforpass 
inner join sql_students on stu_studentid=stm_studentid 
group by stm_studentid,stu_name 
having count(*) = (select count(*) from sql_exam) 

запрос № 2: -

  • Группа позволяет рассчитать количество сданных экзаменов.
  • имея позволяет сравнивать количество до количества экзаменов доступных
select stu_name,count(*) as NumExamsTaken 
from sql_studentmarks 
join sql_students on stu_studentid=stm_studentid 
group by stu_name 
having count(*) = (select count(*) from sql_exam) 

Запрос # 3:
Это поможет вам начать

select stu_studentid,stu_name, 
      MG.stm_mark as MathGrade, 
      EG.Stm_mark as EnglishGrade 
    from sql_students 
    join sql_exam MATH on MATH.exa_name='MATHS' 
    join sql_exam ENG on ENG.exa_name='ENGLISH' 
    join sql_studentmarks MG on MG.stm_studentid=stu_studentid 
          and MG.stm_examid=MATH.exa_examId 
    join sql_studentmarks EG on EG.stm_studentid=stu_studentid 
          and EG.stm_examid=ENG.exa_examId 
+0

Привет, Sparky, я получаю результат правильно с вашим ответом на Query # 1 на скрипте SQL, но когда я пытаюсь использовать его на MS SQL Server 2008, он возвращает всех студентов, сдавших любой экзамен. Почему так? – user3209814

+0

ОК, я пропустил необходимость сдавать все экзамены. Я изменил запрос для вас – Sparky

+0

Теперь запрос # 1 кажется идеальным. Благодарю. Позвольте мне проанализировать этот и попробовать второй. :) – user3209814

2

Для # 1

SELECT s.stu_name 
FROM sql_studentmarks AS m 
JOIN sql_students AS s ON m.stm_studentid = s.student_id 
JOIN sql_exam AS x ON COUNT(m.stm_examid) = COUNT (x.stm_examid) 
WHERE m.stm_mark >= x.exa_minmarkreqdforpass GROUP BY s.stu_studentid; 

Для # 2 можно основывать на счете экзамена, возможно создание вара в операторе отбора:

SELECT s.stu_name 
FROM sql_studentmarks AS m 
JOIN sql_students AS s ON m.stm_studentid = s.stu_studentid 
RIGHT OUTER JOIN sql_exam AS x ON COUNT(m.stm_examid) = COUNT (x.stm_examid) 
AND m.stm_examid IS NOT NULL 
GROUP BY s.stu_student_id; 

FOR # 3 использования примеров из выше, просто присоединяется будет делать:

SELECT s.stu_name, x.exa_name, m.stm_mark 
FROM sql_studentmarks AS m 
JOIN sql_students AS s ON m.stm_studentid = s.stu_studentid 
JOIN sql_exam x ON m.stm_examid = x.exa_examid AND s.stu_studentid = x.exa_studentid; 
+0

Ваш первый запрос не учитывает тот факт, что пройденный класс хранится в таблице экзаменов. Ваш второй запрос не использует созданную вами переменную ... – Sparky

+0

Мои извинения @Sparky, это был RPIA, пытающийся отредактировать ответ прямо на моем телефоне. Спасибо, что указал на недостатки моего кода, я отредактировал ответ для решения проблем. – safejrz

Смежные вопросы