赶上多种类型的数据

问题描述:

我有一个表(Task)是这样的:赶上多种类型的数据

Task Table

,我需要这样回答:

TaskResult

我做第一个查询是这样的:

select 
    StudentID, AdmissionID, EnquiryID, EnquiryDetailsID 
from 
    Task 
where 
    TaskUser = 0 and BranchID = 1 
  • 如果我收到studentID,则在循环中创建第二个查询以搜索学生的名字和姓氏。

  • elseif我收到EnquiryID,然后在循环中创建第二个查询以查找查询名和姓。

  • elseif我得到AdmissionID,然后在循环中创建第二个查询来搜索入门人员的名字和姓氏。

  • elseif我收到EnquiryDetailsID,然后在循环中创建第二个查询来搜索EnquiryDetails的名字和姓氏。

因此,它创建一个循环,并在页面上的负载时间很重。

我需要将两个查询合并为一个查询。所以页面不会被加载。

我只有两个元素,即taskUser和BranchID。

请帮助我!提前致谢 !!!

+0

SQL没有循环。加入JOIN,或许是LEFT JOIN。 – jarlh

+0

他们是一个页面加载(经典ASP),由于循环。 – jai

+0

你试图在这里完成。请给我们一些样品数据 – Munavvar

所以 - 它看起来像你有一个奇怪的组织任务表,并作为一个结果,你将不得不做轻度奇怪的事情来查询权。根据您的描述,任务表中的一行包含studentId,admissionId,enquiryId或enquiryDetailId。这不是一个最佳的方法来做到这一点...但我明白,有时你必须与你有什么。

因此,得到的名字,你必须加入到名字的来源...,并假设他们是所有的地方,相关表中,你可以这样做:

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 

...或者,您可以完成同样的事情有点内外:

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 

使用LEFT JOINCOALESCE这样的:

--not tested 
select StudentID, AdmissionID, EnquiryID, EnquiryDetailsID, 
     COALESCE(s.name, e.name, d.name, ed.name) as name, etc. 
from Task t 
left join student s on s.id = t.studentID 
left join Enquiry e on e.id = t.EnquiryID 
left join Admission d on d.id = t.AdmissionID 
left join EnquiryDetails ed on ed.id = t.EnquiryDetailsID 
where TaskUser=0 and BranchID=1