2011-06-18 54 views
4

這是帶有完整問題的已編輯問題。以下是表格結構。 (以下僅列出必要的欄。)在where子句中使用逗號分隔的值並將其與in子句進行比較

表名:tblQualificationMaster

Qualiid QualiName 
------- --------- 
1  S.S.C 
2  H.S.C 
3  B.Sc 
4  M.C.A 
5  M.Sc(IT) 
6  B.E 
7  M.B.A 
8  B.Com 
9  M.E 
10  C.S 
12  M.Com 

表名:tblAppResumeMaster

AppId FirstName LastName TotalExpYears TotalExpMonths 
----- --------- -------- ------------- -------------- 
1  Rahul  Patel  7    0 
2  Ritesh  Shah  0    0 
3  Ajay  shah  7    6 
4  Ram  Prasad 7    6 
5  Mohan  Varma  5    0 
6  Gaurav  Kumar  8    0 

表名:tblAppQualificationDetail。 (爲了更好的閱讀我的除了第一行,但在我的數據庫中的所有行的所有值都存儲像appid=1寫逗號分隔值即每一行對應一個qualificationid。)

Appid QualiId 
----- ------- 
1  1 
1  2 
1  3 
1  4 
2  1,2,3 
3  1,2,6 
4  1,2,3,5 
5  1,2,3,4 
6  1,2,6,9 

表名:tblVacancyMaster

VacId Title   Criteria Req.Exp KeySkills 
----- -------------- -------- ------- --------------- 
1  Programmer  4,5,6  4  .net,java,php 
2  TL    4,5  3  .net,java,php 
3  Project Mngr. 4,6,9  4  .net,java,php,sql 
4  Java Developer 4,5,6  0  java,oracle,sql 
5  Manager   7,9  7  bussiness management 
6  Supervisior  3,8  3  marketing 
7  PHP Developer 4,5  0  php,mysql,send 

現在基於這個細節我想創建應該有下列字段的視圖。 (它顯示了VacId=1但我需要這對所有空缺,這樣我可以解僱在那裏這種觀點就像select * from view where VacId=3條款。)

AppId FirstName LastName QualiName QualiId TotalExp VacId VacTitle 
----- --------- -------- --------- ------- -------- ----- ---------- 
1  Rahul  Patel  M.C.A  4  7   1  Programmer 
3  Ajay  Shah  B.E.  6  7   1  Programmer 
5  Mohan  Verma  M.C.A  4  5   1  Programmer 
6  Gaurav  Kumar  B.E  6  8   1  Programmer 
6  Gaurav  Kumar  M.E  9  8   1  Programmer 

該視圖顯示的AppId 1,3,5和6有資格獲得空位3但它顯示應用程序6的重複條目。我如何獲得唯一記錄?

我在數據庫設計中可能是錯誤的,因爲這是我的第一個項目,我正在學習數據庫,因此,如果出現違反數據庫標準的情況,請告訴我並糾正錯誤。

我以前的查詢 (注:此前我使用一箇中間表其爲具有列VacIdtblVacancyCriteriaDetailQualiId和我的表tblVacancyMaster是沒有列標準)

select 
    ARM.AppId, 
    ARM.AppFirstName, 
    ARM.AppLastName, 
    ARM.AppMobileNo, 
    AQD.QualiId, 
    VacQualiDetail.QualiName, 
    ARM.AppEmailId1, 
    VacQualiDetail.VacID, 
    ARM.TotalExpYear, 
    VacQualiDetail.VacTitle, 
    VacQualiDetail.DeptId, 
    VacQualiDetail.CompId, 
    CM.CompName 
from 
    tblAppResumeMaster ARM, 
    tblAppQualificationDetail AQD, 
    tblCompanyMaster CM, 
    (
    select 
     VM.VacID, 
     VM.VacTitle, 
     VM.CompId, 
     VM.DeptId, 
     vcd.QualificationID, 
     QM.QualiName, 
     VM.RequiredExperience as Expe 
    from 
     tblVacancyCriteriaDetail VCD, 
     tblVacancyMaster VM, 
     tblQualificationMaster QM 
    where VCD.VacID=VM.VacID 
     and VCD.QualificationID=QM.QualificationId 
     and VM.Status=0 
) as VacQualiDetail 
where AQD.AppId=arm.AppId 
    and aqd.QualiId=VacQualiDetail.QualificationID 
    and ARM.TotalExpYear>=Expe 
    and cm.CompId=VacQualiDetail.CompId 
+0

您正在使用哪些DBMS? –

+0

@a_horse_with_no_name SQL SERVER 2008 R2 –

+2

我沒有針對SQL Server的解決方案,但您應該重新考慮設計。您違反了關係數據庫設計的基本原則,這就是爲什麼這個問題如此複雜以至於無法解決。 –

回答

2
create view vAppList as 
select AppId, 
     FirstName, 
     LastName, 
     QualiName, 
     Qualiid, 
     TotalExpYears, 
     VacId, 
     Title 
from (select ARM.AppId, 
      ARM.FirstName, 
      ARM.LastName, 
      QM.QualiName, 
      QM.Qualiid, 
      ARM.TotalExpYears, 
      VM.VacId, 
      VM.Title, 
      row_number() over(partition by ARM.AppId, VM.VacId order by QM.Qualiid) as rn 
     from tblAppResumeMaster as ARM 
     inner join tblAppQualificationDetail as AQD 
      on ARM.AppId = AQD.Appid 
     inner join tblQualificationMaster as QM 
      on AQD.QualiId = QM.Qualiid 
     inner join tblVacancyMaster as VM 
      on ','+VM.Criteria+',' like '%,'+cast(QM.Qualiid as varchar(10))+',%'  
    ) as V 
where V.rn = 1 

當一個申請人匹配多於一個資格時,子查詢將具有重複。在這種情況下,QualiName將具有最低值Qualiid的值。

如果你回去使用tblVacancyCriteriaDetail,我認爲你應該,視圖看起來像這樣。

create view vAppList as 
select AppId, 
     FirstName, 
     LastName, 
     QualiName, 
     Qualiid, 
     TotalExpYears, 
     VacId, 
     Title 
from (select ARM.AppId, 
      ARM.FirstName, 
      ARM.LastName, 
      QM.QualiName, 
      QM.Qualiid, 
      ARM.TotalExpYears, 
      VM.VacId, 
      VM.Title, 
      row_number() over(partition by ARM.AppId, VM.VacId order by QM.Qualiid) as rn 
     from tblAppResumeMaster as ARM 
     inner join tblAppQualificationDetail as AQD 
      on ARM.AppId = AQD.Appid 
     inner join tblQualificationMaster as QM 
      on AQD.QualiId = QM.Qualiid 
     inner join tblVacancyCriteriaDetail as VCD  
      on QM.Qualiid = VCD.QualiID 
     inner join tblVacancyMaster as VM 
      on VCD.VacId = VM.VacId 
    ) as V 
where V.rn = 1  
-1

修訂:

創建一個新的功能:

CREATE FUNCTION Split(@String varchar(8000), @Delimiter char(1))  
returns @temptable TABLE (items varchar(8000))  
as  
begin  
    declare @idx int  
    declare @slice varchar(8000)  

    select @idx = 1  
     if len(@String)<1 or @String is null return  

    while @idx!= 0  
    begin  
     set @idx = charindex(@Delimiter,@String)  
     if @idx!=0  
      set @slice = left(@String,@idx - 1)  
     else  
      set @slice = @String  

     if(len(@slice)>0) 
      insert into @temptable(Items) values(@slice)  

     set @String = right(@String,len(@String) - @idx)  
     if len(@String) = 0 break  
    end 
return  
end 

然後你湊LD用我的上一個答案:

SELECT * FROM TableA WHERE ColumnID IN split(SELECT ColumnWithValues FROM TableB) 
+2

@Dementic它不會工作,因爲逗號分隔的資格ID是字符串。這意味着「4,6,9」是一個字符串,表2中的資格ID也是字符串。由於「4,6,9」與「1」,「2」,「6」或「9」不相似,因此它不會返回任何記錄 –

+0

我不確定您是否正確。 因爲當你做一個選擇(對於一列),結果將與它存儲在該列中相同。 我無法測試它,因爲我在度假,但如果你可以測試它, 我幾乎肯定它應該工作(或不是:D) – Dementic

+0

我認爲你是對的,但我不確定。 這在MySQL上運行良好,但在MSSql上可能會失敗 – Dementic

0

嘗試使用COALESCE函數來獲得一列由逗號separeted.this您行是一個簡單的examle

declare @QualIDs varchar(50)='' 
select @QualIDs= COALESCE(@QualIDs+ ', ', '') + CAST(Qualiid AS varchar(50))) 
from tblQualificationMaster 

這將返回所有Qualiid用逗號隔開即可在where子句或子查詢中使用它。

閱讀更多關於COALESCEhttp://msdn.microsoft.com/en-us/library/ms190349.aspx

+2

這也可以匹配「66」,「69」等... – Dementic

+0

Miroprocessor我更新了我的問題。請再看一遍。之前我只展示了我的部分問題 - –

+0

我編輯了我的答案,試試 –

1

我從來沒有與MS SQL Server的工作,所以我認爲最好的辦法是使用正則表達式(試圖找到一些關於它的SQL Server文檔中)。

但我認爲這應該工作:

select * from Table1 Where (',' + qualificationid + ',') like '%,6,%'; 

我認爲字符串連接使用+標誌來完成。

+0

我同意。這是解決破碎設計的唯一方法。 –

+0

我已更新我的問題。請再看一遍。之前我只展示了我的部分問題 –

相關問題