Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Cattura più tipi di dati in SQL Server

Quindi, sembra che tu abbia una tabella delle attività organizzata in modo strano e, di conseguenza, dovrai fare cose leggermente strane per interrogare correttamente. In base alla tua descrizione, una riga nella tabella delle attività contiene uno studentId, un administrationId, un enquiryId o un enquiryDetailId. Questo non è un modo ottimale per farlo... ma capisco che a volte devi cavartela con quello che hai.

Quindi, per ottenere i nomi, devi unirti alla fonte dei nomi... e supponendo che siano dappertutto, nelle tabelle correlate, potresti fare qualcosa del tipo:

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

...oppure, puoi realizzare la stessa cosa al rovescio:

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