Используйте разделенные запятыми значения в предложении where и сравните его с предложением - PullRequest
4 голосов
/ 18 июня 2011

Это отредактированный вопрос с полной проблемой.Ниже приведена структура таблицы.(Ниже показаны только необходимые столбцы.)

Имя таблицы: 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, но мне это нужно для всех вакансий, чтобы я мог использовать предложение where в этом представлении, например 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. Как я могу получить уникальные записи?

Я могу ошибаться при проектировании базы данных, потому что это мой первый проект, и я изучаю базу данных, поэтому позвольте мнезнать и исправлять, если что-то идет вразрез со стандартами базы данных.

Мой предыдущий запрос (Примечание. Ранее я использовал одну промежуточную таблицу tblVacancyCriteriaDetail, в которой были столбцы VacId и QualiId, а моя таблица 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

Ответы [ 4 ]

3 голосов
/ 19 июня 2011
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 голос
/ 18 июня 2011

Я никогда не работал с MS SQL Server, поэтому я думаю, что лучшим способом было бы использовать Regex (попробуйте найти что-нибудь об этом в документации по SQL Server).

Но я думаю, что это должно работать:

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

Я предполагаю, что конкатенация строк выполняется с использованием знака +.

0 голосов
/ 18 июня 2011

попробуйте использовать функцию COALESCE, чтобы получить строки в одном столбце с запятой separeted. Это простой пример

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

это вернет все Qualiid через запятую, вы можете использовать его в предложении where или в подзапросе.

чтобы узнать больше о COALESCE перейдите на http://msdn.microsoft.com/en-us/library/ms190349.aspx

0 голосов
/ 18 июня 2011

исправлено:

создайте новую функцию:

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

тогда вы можете использовать мой предыдущий ответ:

SELECT * FROM TableA WHERE ColumnID IN split(SELECT ColumnWithValues FROM TableB)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...