2016-05-10 10 views
-1

Ich habe vier Tabellen abgerufen werden:SQL-Abfrage verschiedene Datensätze aus vier Tabellen

  • Department (DepartmentId)
  • Platz (courseid, DepartmentId)
  • CourseInstructor (courseid, InstructorId)
  • Instructor (InstructorId, Vorname, Nachname, HireDate)

Ich arbeite an asp.net mvc. Der Instructor Modell ist -

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; 
    } 
    } 

Jetzt muss ich basierend auf einem gegebenen DepartmentId alle verschiedene Instructor Aufzeichnung einer Abteilung finden.

Ich schrieb die folgende SQL-Abfrage, aber es sagt -

Mehrdeutige Spaltenname

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); 

Hier id 'InstructorId' ist die gebotene DepartmentId. Wie kann ich das lösen?

+1

Verwenden qualifizierte Spaltennamen (d.h.immer mit einem Tabellen-Alias) und du wirst * nie * dieses prbolem haben. –

+1

Es wäre besser gewesen, eine neue Frage zu stellen, als die alte zu bearbeiten. Die Antworten auf die ursprüngliche Frage ergeben keinen Sinn mehr. Dies wird diejenigen verwirren, die dir folgen. –

Antwort

1

Die Verwendung von Aggregation Verdächtiger ist. Hier ist eine Alternative, die exists verwendet:

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 
      ); 

Hinweise:

  • Diese Version benötigt keine Aggregation, so sollte es schneller sein.
  • Die join zu Department ist nicht erforderlich, da die ID in der Course Tabelle ist.
  • Die left join s sind nicht erforderlich, da Ihre Abfrage eine Übereinstimmung unter DepartmentId erfordert.
  • Tabellenaliasnamen erleichtern das Schreiben und Lesen der Abfrage.
  • Vollständig qualifizierte Spaltennamen verhindern das Problem, das Sie haben.
+0

Danke. Es funktioniert gut. –

0

Da die InstructorId in mehr als einer Tabelle angezeigt wird, weiß SQL Server nicht, welche zurückgegeben werden soll. Es gibt zwei Möglichkeiten, dies zu beheben.

Sie können den Tabellennamen vor den Spaltennamen setzen. So wird SELECT InstructorId...SELECT Instructor.InstructorId....

Oder Sie können die Anzahl der Eingabe von aliasing Ihre Tabellen reduzieren und den Alias ​​vor dem Spaltennamen anhängen.

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

Sie müssen alle Spaltennamen qualifizieren, die in zwei oder mehr ausgewählten Tabellen vorhanden sind:

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

Verwenden unterhalb Abfrage

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"; 
Verwandte Themen