2017-04-12 59 views
0

我有一個表(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

回答

0

所以 - 它看起來像你有一個奇怪的組織任務表,並作爲一個結果,你將不得不做輕度奇怪的事情來查詢權。根據您的描述,任務表中的一行包含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 
0

使用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