Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Erfassen Sie mehrere Datentypen in SQL Server

Es sieht also so aus, als hätten Sie eine seltsam organisierte Aufgabentabelle, und als Ergebnis müssen Sie leicht seltsame Dinge tun, um die Abfrage richtig zu machen. Gemäß Ihrer Beschreibung enthält eine Zeile in der Aufgabentabelle entweder eine StudentId, eine ZulassungsId, eine AnfrageId oder eine AnfrageDetailId. Dies ist kein optimaler Weg, dies zu tun ... aber ich verstehe, dass Sie manchmal mit dem auskommen müssen, was Sie haben.

Um die Namen zu erhalten, müssen Sie sich also mit der Quelle der Namen verbinden ... und vorausgesetzt, sie sind überall in verwandten Tabellen vorhanden, könnten Sie Folgendes tun:

select 
  t.StudentID,t.AdmissionID,t.EnquiryID,t.EnquiryDetailsID,x.FirstName,x.LastName
from Task t inner join Student s on t.StudentId = s.Id
union all
select 
  t.StudentID,t.AdmissionID,t.EnquiryID,t.EnquiryDetailsID,x.FirstName,x.LastName
from Task t inner join Admission a on t.AdmissionId = a.Id
union all 
select 
  t.StudentID,t.AdmissionID,t.EnquiryID,t.EnquiryDetailsID,x.FirstName,x.LastName
from Task t inner join Enquiry e on t.EnquiryId = e.Id
union all 
select 
  t.StudentID,t.AdmissionID,t.EnquiryID,t.EnquiryDetailsID,x.FirstName,x.LastName
from Task t inner join EnquiryDetail d on t.EnquiryDetailId = d.Id

... oder Sie können das Gleiche von innen nach außen erreichen:

select 
  t.StudentID, 
  t.AdmissionID, 
  t.EnquiryID, 
  t.EnquiryDetailsID,
  x.FirstName,
  x.LastName
from 
  Task t
  inner join
  (
    select 's' source, Id, FirstName, LastName from Student union all
    select 'a' source, Id, FirstName, LastName from Admission union all
    select 'e' source, Id, FirstName, LastName from Enquiry union all
    select 'd' source, Id, FirstName, LastName from EnquiryDetail
  ) as x
  on
    ( t.StudentId  = x.Id and x.source = 's' )
    or
    ( t.AdmissionId = x.Id and x.source = 'a' )
    or
    ( t.EnquiryId = x.Id and x.source = 'e' )
    or 
    ( t.EnquiryDetailId = x.Id and x.source = 'd' )
where 
  t.TaskUser=0 and t.BranchID=1