2013-09-16 3 views
0

У меня есть две таблицы, которые имеют те же столбцы 1. Так, например, за исключением:Объединить SQL Таблицы

Table1 (column names): Student | Course | Exam1 | Exam2 
Table2 (column names): Student | Course | Exam3 | FinalExam 

Я хотел бы объединить эти две таблицы, чтобы получить:

Table: Student | Course | Exam1 | Exam2 | FinalExam 

I есть что-то по следующему:

Select 
    student, 
    course, 
    Exam1, 
    Exam2 
From Table1 

Select 
    student, 
    course, 
    Exam3, 
    FinalExam 
From Table2 


Select 
    student, 
    course, 
    Coalesce(t1.Exam1, 0) as Exam1 
    Coalesce(t1.Exam2, 0) as Exam2 
    Coalesce(t2.Exam3, 0) as Exam3 
    Coalesce(t2.FinalExam, 0) as FinalExam 
From Table1 t1, Table2 t2 

есть ли способ, чтобы сделать это более эффективно/сжато с использованием внутреннего соединения?

+0

Вам нужен декартовой продукт, созданный? Поскольку t1, t2 будет производить декартово произведение вместо объединения. Вы можете присоединиться к ним студентом и курсом, основываясь на ваших объяснениях. –

+0

У вас есть одна и та же комбинация «Студент, курс» в обеих таблицах? –

+0

Вам нужно больше информации. Является ли студент и курс гарантированным в обеих таблицах? Если нет, как вы хотите, чтобы это лечилось? – Kevin

ответ

2

Что вы делаете, это декартово произведение, которое будет иметь n * n строк.

Попробуйте

Select 
    student, 
    course, 
    Exam1, 
    Exam2, 
    Exam3, 
    FinalExam, 
From Table1 t1, Table2 t2 
Where t1.student=t2.student 
and t1.course=t2.course; 

Этот запрос работает на arrumption, что студенты оказались для экзаменов либо 1 или 2 по крайней мере, и либо экзаменов 3 или Final. Если есть возможный случай отсутствия, вам необходимо использовать внешнее соединение. как в следующем примере, но не ограничиваясь

Select 
    student, 
    course, 
    Exam1, 
    Exam2, 
    Exam3, 
    FinalExam, 
From Table1 t1, Table2 t2 
Where t1.student=t2.student(+) 
and t1.course=t2.course(+); 
+1

Согласовано. Если бы мы все поняли вопрос, нет смысла делать декартово произведение. +1 –

+0

Пожалуйста, не используйте неявные соединения старого стиля в предложении where. Используйте современный явный синтаксис JOIN, особенно для внешних соединений. Oracle рекомендует прекратить использование (запатентованного) '(+)' оператора. –

+0

Не могли бы вы опубликовать источник @a_horse_with_no_name – SriniV

1

Вот что я думаю вы хотите основываясь на некоторых предположениях из вашего вопроса.

select isnull(t1.student, t2.student), isnull(t1.course, t2.course), 
    IsNull(t1.Exam1, 0) as Exam1 , 
    IsNull(t1.Exam2, 0) as Exam2, 
    IsNull(t2.Exam3, 0) as Exam3, 
IsNull(t2.FinalExam, 0) as FinalExam 
From Table1 t1 
    full outer join Table2 t2 
     on t1.student = t2.student 
      and t1.course = t2.course 
Смежные вопросы