2016-05-10 4 views
-1

У меня есть четыре таблицы:SQL запрос для получения отдельных записей из четырех таблиц

  • отдел (DepartmentID)
  • курс (CourseId, DepartmentID)
  • CourseInstructor (CourseId, InstructorId)
  • Instructor (InstructorId, FirstName, LastName, HireDate)

Я работаю над asp.net mvc. Модель инструктора -

public class Instructor 
{ 
    public int InstructorId {get; set;} 
    public string FristName {get; set;} 
    public string LastName {get; set;} 
    public DateTime HireDate {get; set;} 
    public string FullName 
    { 
    get 
    { 
     return FirstName + " " + LastName; 
    } 
    } 

Теперь мне нужно найти всю отчетливую запись инструктора отдела, основанную на данную DepartmentID.

Я написал следующий SQL-запрос, но он говорит -

неоднозначного имя столбец '' InstructorId

string query = "select InstructorId, MAX(FirstName), MAX(LastName) from Instructor " 
      + "left join CourseInstructor on CourseInstructor.InstructorId = Instructor.InstructorId " 
      + "left join Course on Course.CourseId = CourseInstructor.CourseId " 
      + "left join Department on Department.DepartmentId=Course.DepartmentId " 
      + "where [email protected] " 
      + "group by Instructor.InstructorId"; 
     IEnumarable<Instructor> Instructors = db.Database.SqlQuery<Instructor>(query, id); 

Здесь идентификатор данного DepartmentID. Как я могу это решить.

+1

Используется имена столбцов квалифицированных (т.е.всегда с псевдонимом таблицы), и вы никогда не будете иметь этот prbolem. –

+1

Было бы лучше задать новый вопрос, а не редактировать старый. Ответы на исходный вопрос больше не имеют смысла. Это смущает тех, кто следует за вами. –

ответ

1

Использование агрегации является подозреваемым. Вот альтернатива, которая использует exists:

select i.* 
from Instructor i 
where exists (select 1 
       from CourseInstructor ci join 
        Course c 
        on c.CourseId = ci.CourseId 
       where ci.InstructorId = i.InstructorId and 
        c.DepartmentId = @p0 
      ); 

Примечания:

  • Эта версия не требует агрегации, поэтому она должна быть быстрее.
  • join до Department не нужно, потому что идентификатор находится в таблице Course.
  • left join s не нужны, потому что для вашего запроса требуется совпадение на DepartmentId.
  • Табличные псевдонимы облегчают запись и чтение.
  • Полноценные имена столбцов предотвращают возникшую проблему.
+0

Спасибо. Он работает нормально. –

0

Поскольку InstructorId появляется в нескольких таблицах, SQL Server не знает, что вернуть. Есть два способа решить эту проблему.

Вы можете добавить имя таблицы перед именем столбца. So SELECT InstructorId... будет SELECT Instructor.InstructorId....

Или вы можете уменьшить количество ввода на aliasing ваших таблиц и добавить псевдоним перед именем столбца.

select 
    i.InstructorId, 
    MAX(i.FirstName), 
    MAX(i.LastName) 
from 
    Instructor AS i 
     left outer join CourseInstructor AS ci   on ci.InstructorId = i.InstructorId 
     left outer join Course on AS c     on c.CourseId  = ci.CourseId 
     left outer join Department AS d    on d.DepartmentId = c.DepartmentId 
where 
    [email protected] 
group by 
    i.InstructorId 
; 
0

Вы должны квалифицироваться все имена столбцов, которые присутствуют в двух или более выбранных таблиц:

string query = "select Instructor.InstructorId, MAX(Instructor.FirstName), MAX(Instructor.LastName) from Instructor " 
       + "left join CourseInstructor on CourseInstructor.InstructorId = Instructor.InstructorId " 
       + "left join Course on Course.CourseId = CourseInstructor.CourseId " 
       + "left join Department on Department.DepartmentId=Course.DepartmentId " 
       + "where [email protected] " 
       + "group by Instructor.InstructorId"; 
      IEnumarable<Instructor> Instructors = db.Database.SqlQuery<Instructor>(query, id); 
0

Использование ниже запроса

string query = "select Instructor.InstructorId, MAX(FirstName), MAX(LastName) from Instructor " 
     + "left join CourseInstructor on CourseInstructor.InstructorId = Instructor.InstructorId " 
     + "left join Course on Course.CourseId = CourseInstructor.CourseId " 
     + "left join Department on Department.DepartmentId=Course.DepartmentId " 
     + "where [email protected] " 
     + "group by Instructor.InstructorId"; 
Смежные вопросы