2012-06-27 2 views
0

문자열 일치 조건에 따라 많은 테이블을 조인하도록 설계된 이전 개발자 저장 프로 시저를 수정 한 다음 조인 된 테이블을 검색하고 그 정보를 함께 반환합니다. 정보가 어떻게 매치되는지에 대한 설명과 함께커서를 사용하여 행의 각 열을 확인하고 각 일치에 대해 행을 반환하십시오.

현재 프로 시저가 조인 된 테이블의 각 열을 살펴보고 일치하는 항목을 찾으면 결과 테이블에 새 행을 만들고 원본 테이블의 다음 열로 이동합니다. 문제는 행에 여러 개의 일치 항목이있는 경우입니다. 첫 번째 일치 항목이 생성되지 않은 후에는 아무 것도 없습니다.

----A---B---C---D---E---F---G---H---I--- 
|          | 
1.-------------------------------------| 
| N Y Y N N N N N N | 
2.-------------------------------------- 
| Y N N N N N N N N | 
3.-------------------------------------- 
| N Y N N Y Y N N N | 
---------------------------------------- 

테이블에 결과 :

내가 좋아하는 테이블을 필요로 각 열에 대한 별도의 루틴을 만드는 것보다 모든 일치하는 항목을 찾을 수있는보다 효율적인 방법이 있나요

----A---B---C---D---E---F---G---H---I--- 
|          | 
1.-------------------------------------- 
| found a match in row 1-B   | 
2.-------------------------------------- 
| found a match in row 1-C   | 
3.-------------------------------------- 
| found a match in row 2-A   | 
4.-------------------------------------- 
| found a match in row 3-B   | 
5.-------------------------------------- 
| found a match in row 3-E   | 
6.-------------------------------------- 
| found a match in row 3-F   | 
---------------------------------------- 

그 점검 할 필요가있다. 커서가 문제를 해결할 수 있다고 들었지만,이 쿼리는 이미 상당한 시간이 걸립니다. 그것은 여기에 도움이 경우

은 원래 절차 : 내가 거기에 더 효율적인 방법이 내가 큰 그림의 완전히 확실하지 않다 확신

SELECT 
    CASE WHEN (rpfname LIKE @SearchString OR rplname LIKE @SearchString) AND rlrelcode = 'A' THEN 2 
     WHEN ((rpfname LIKE @SearchString OR rplname LIKE @SearchString) AND (rlrelcode LIKE 'c%' OR rlrelcode LIKE 'REL%' OR rlrelcode = 'E')) OR clname1 LIKE @SearchString OR clname2 LIKE @SearchString OR clcontact LIKE @SearchString OR clrefer LIKE @SearchString OR mcontact LIKE @SearchString THEN 3 
     ELSE 1 END AS type, 
    ISNULL(CAST(mmatter AS VARCHAR(100)), '<Matter does not exist>') AS client_matter_number, 
    clnum, 
    mdesc1 AS matter_description, 
    ISNULL(mbillaty, udvalue) AS ttk, 
    ISNULL(mopendt, clopendt) AS open_date, 
    mclosedt AS close_date, 
    LTRIM(ISNULL(clname1, '') + ISNULL(' ' + clname2, '')) AS client_name, 
    CASE WHEN (rpfname LIKE @SearchString OR rplname LIKE @SearchString) THEN LTRIM(ISNULL(rpfname, '') + ISNULL(' ' + rplname, '')) 
     WHEN rddesc LIKE @SearchString THEN LTRIM(rddesc ) 
     WHEN (clname1 LIKE @SearchString OR clname2 LIKE @SearchString) THEN LTRIM(ISNULL(clname1, '') + ISNULL(' ' + clname2, '')) 
     WHEN clcontact LIKE @SearchString THEN LTRIM(clcontact) 
     WHEN clrefer LIKE @SearchString THEN LTRIM(clrefer) 
     WHEN cddesc LIKE @SearchString THEN LTRIM(cddesc) 
     WHEN mname LIKE @SearchString THEN LTRIM(mname) 
     WHEN mdesc1 LIKE @SearchString THEN LTRIM(mdesc1) 
     WHEN mddesc LIKE @SearchString THEN LTRIM(mddesc) 
     WHEN mcontact LIKE @SearchString THEN LTRIM(mcontact) 
     WHEN fdesc1 LIKE @SearchString THEN LTRIM(fdesc1) 
     WHEN fdnarr LIKE @SearchString THEN LTRIM(fdnarr) 
     WHEN subdesc1 LIKE @SearchString THEN LTRIM(subdesc1) 
     WHEN subnarr LIKE @SearchString THEN LTRIM(subnarr) END AS found_search_string, 
    CASE WHEN rpfname LIKE @SearchString OR rplname LIKE @SearchString THEN dbo.stcGetRelationNarrative(rlindex) 
     ELSE '' END AS notes, 
    CASE WHEN (rpfname LIKE @SearchString OR rplname LIKE @SearchString) THEN rlrelation 
     ELSE '' END AS relationship, 
    CASE WHEN (rpfname LIKE @SearchString OR rplname LIKE @SearchString) AND rlrelcode = 'A' THEN 'A' 
     WHEN ((rpfname LIKE @SearchString OR rplname LIKE @SearchString) AND (rlrelcode LIKE 'c%' OR rlrelcode LIKE 'REL%' OR rlrelcode = 'E')) OR clname1 LIKE @SearchString OR clname2 LIKE @SearchString OR clcontact LIKE @SearchString OR clrefer LIKE @SearchString OR mcontact LIKE @SearchString THEN 'CF' 
     ELSE '?' END AS relation_code, 
    CASE WHEN (rpfname LIKE @SearchString OR rplname LIKE @SearchString) THEN 'RP Name' 
     WHEN rddesc LIKE @SearchString THEN 'RP Narrative' 
     WHEN (clname1 LIKE @SearchString OR clname2 LIKE @SearchString) THEN 'Client Name' 
     WHEN clcontact LIKE @SearchString THEN 'Client Contact' 
     WHEN clrefer LIKE @SearchString THEN 'Client Referral' 
     WHEN cddesc LIKE @SearchString THEN 'Client Narrative' 
     WHEN mname LIKE @SearchString THEN 'Matter Name' 
     WHEN mdesc1 LIKE @SearchString THEN 'Matter Description' 
     WHEN mddesc LIKE @SearchString THEN 'Matter Narrative' 
     WHEN mcontact LIKE @SearchString THEN 'Matter Contact' 
     WHEN fdesc1 LIKE @SearchString THEN 'Folder Description' 
     WHEN fdnarr LIKE @SearchString THEN 'Folder Narrative' 
     WHEN subdesc1 LIKE @SearchString THEN 'Submatter Description' 
     WHEN subnarr LIKE @SearchString THEN 'Submatter Narrative' END AS source_of_information 
FROM crlparty rp WITH (NOLOCK) 
    LEFT OUTER JOIN 
    crllink r WITH (NOLOCK) 
     ON r.rpindex = rp.rpindex 
    FULL OUTER JOIN 
    matter m WITH (NOLOCK) 
     ON rlmatter = m.mrelated 
    LEFT OUTER JOIN 
    mattdesc md WITH (NOLOCK) 
     ON m.mmatter = md.mmatter 
    FULL OUTER JOIN 
    client c WITH (NOLOCK) 
     ON ISNULL(m.mclient, r.rlclnum) = c.clnum 
    LEFT OUTER JOIN 
    clidesc cd WITH (NOLOCK) 
     ON c.clnum = cd.clnum 
    LEFT OUTER JOIN 
    crldesc rpd WITH (NOLOCK) 
     ON rpd.rpindex = r.rpindex 
    LEFT OUTER JOIN 
    udf u WITH (NOLOCK) 
     ON u.udjoin = c.clnum AND 
      u.udfindex=40 
    FULL OUTER JOIN 
    folder f WITH (NOLOCK) 
     ON m.mmatter = f.fmatter 
    LEFT OUTER JOIN 
    foldnarr fn WITH (NOLOCK) 
     ON f.findex = fn.findex 
    FULL OUTER JOIN 
    submatter s WITH (NOLOCK) 
     ON r.rlmatter = s.smatter 
    LEFT OUTER JOIN 
    subnarr sn WITH (NOLOCK) 
     ON s.sindex = sn.sindex 

WHERE (rp.rpfname LIKE @SearchString OR rp.rplname LIKE @SearchString) OR 
    rpd.rddesc LIKE @SearchString OR 

    (c.clname1 LIKE @SearchString OR c.clname2 LIKE @SearchString) OR 
    c.clcontact LIKE @SearchString OR 
    c.clrefer LIKE @SearchString OR 
    cd.cddesc LIKE @SearchString OR 

    m.mname LIKE @SearchString OR 
    m.mdesc1 LIKE @SearchString OR 
    md.mddesc LIKE @SearchString OR 
    m.mcontact LIKE @SearchString OR 

    f.fdesc1 LIKE @SearchString OR 
    fn.fdnarr LIKE @SearchString OR 

    s.subdesc1 LIKE @SearchString OR 
    sn.subnarr LIKE @SearchString 
+0

커서를 사용하고 싶지는 않습니다 ~! 그것은이 혼란을 훨씬 더 악화시킬 것입니다. – HLGEM

답변

0

-하지만 단순히 "나는이 질문에 대답 와 같은 표가 필요합니다 ... "여기에 빠르면 더러운 것 같습니다.

SELECT ID, 'Found a match in row ' + CAST(Id as varchar(8))+ '-A' FROM YOURTABLE WHERE A = 'Y' 
    UNION ALL SELECT ID, 'Found a match in row ' + CAST(Id as varchar(8))+ '-B' FROM YOURTABLE WHERE B = 'Y' 
    UNION ALL SELECT ID, 'Found a match in row ' + CAST(Id as varchar(8))+ '-C' FROM YOURTABLE WHERE C = 'Y' 
+0

이것은 올바른 트랙이지만 레코드는 상호 배타적이어야하므로 성능을 위해 UNIOn을 모두 사용해야합니다. 시작하기 전에 임시 테이블에서이 작업을 수행 한 다음 기본 쿼리에서 해당 테이블에 조인 (현재 불필요한 where 절을 제거한 후)하고 값을 가져옵니다. – HLGEM

0

모든 논리가 저장 프로 시저에서 응용 프로그램으로 이동하기 시작했습니다. 저장 프로 시저는 단순히 테이블을 조인하고 몇 가지 간단한 필터를 수행했습니다. 그런 다음 응용 프로그램 (C#)을 사용하여 원하는 결과를 반환했습니다.

관련 문제