2017-06-13 74 views
-1
CREATE Procedure SearchData (@Lastname Varchar(250), @Firstname Varchar(25), @City varchar(50), 
@Address1 varchar(40), 
@HullID varchar(50), 
@State varchar(50), 
@Status varchar(15), 
@Accountpk varchar(40), 
@Agentpk varchar(1000), 
@Issuecopk varchar(40), 
@Productpk varchar(40), @UserType varchar(15), @UserID varchar(30)) As Begin Set NOCOUNT ON 

Declare @Selectionquery   As Varchar(8000) 
Declare @USAquery    As Varchar(4000) 
Declare @NonUSAquery   As Varchar(4000) 
DECLARE @As_User_PK    Varchar(50) 
DECLARE @TopRows    Varchar(50) 
DECLARE @NONUSQueryColumns  Varchar(1000) 
DECLARE @USQueryColumns   Varchar(1000) 
DECLARE @QueryColumnsTemp  Varchar(1000) 

DECLARE @errordesc varchar(max) 

set @Selectionquery   = '' 
set @USAquery    = '' 
set @NonUSAquery   = '' 
Set @NONUSQueryColumns  = '' 
Set @USQueryColumns   = '' 
Set @QueryColumnsTemp  = '' 



Select @TopRows = Parameter_NUMBER_1 
from cl_parameters 
where cl_parameter_code='CLIENTSEARCH' 

select @As_User_PK = AS_User_PK 
from as_users 
where AS_User_ID = @UserID 

Set @USQueryColumns = ' 
    SELECT PM.POLICY_NO, 
      PM.POLICY_STATUS_CODE, 
      --MODIFIED BY SARATH FOR COMPATABILITY MODE ON JAN 15 2014 
      --ltrim(rtrim(ltrim(rtrim(isnull(CL.first_name,'+''''+' '+''''+') + '+''''+' '+''''+'+ isnull(CL.middle_name,'+''''+''+''''+'))) + '+''''+' '+''''+ '+ CL.last_org_name)) as last_org_name , 
      Replace(ltrim(rtrim(ltrim(rtrim(isnull(CL.first_name,'+''''+' '+''''+') + '+''''+' '+''''+'+ isnull(CL.middle_name,'+''''+''+''''+'))) + '+''''+' '+''''+ '+ CL.last_org_name)), ''&'', ''-'') as LASTORGNAME , 
      Replace(CL.FULL_LEGAL_NAME, ''&'', ''-'') as FULL_LEGAL_NAME, 
      CA.ADDRESS_LINE1, 
      CA.TOWN_CITY + '+''''+' '+''''+' + ISNULL(CLSTATE.STATE_NAME,CA.STATE_CODE), 
      CONVERT(VARCHAR(20), TERM.Term_Start_Date,101)+ '+''''+' - '+''''+' +CONVERT(VARCHAR(20),TERM.Term_End_Date,101), 
      Replace(CLAGENT.LAST_ORG_NAME, ''&'', ''-'') as LAST_ORG_NAME, 
      (Select SCREEN_NAME from CL_CLIENT where CL_CLIENT_PK=PM.ISSUECO_CLIENT_FK), 
      PRODUCT.Screen_Name, 
      PM.PO_POLICY_MASTER_PK' 

    Set @USAquery = ' 
      FROM dbo.PO_POLICY_MASTER PM 
      INNER JOIN CL_CLIENT CL 
      ON  PM.OWNER_CLIENT_FK = CL.CL_CLIENT_PK' 


Set @NONUSQueryColumns = ' 
    SELECT PM.POLICY_NO, 
      PM.POLICY_STATUS_CODE, 
      --MODIFIED BY SARATH FOR COMPATABILITY MODE ON JAN 15 2014 
      --ltrim(rtrim(ltrim(rtrim(isnull(CL.first_name,'+''''+' '+''''+') + '+''''+' '+''''+'+ isnull(CL.middle_name,'+''''+''+''''+'))) + '+''''+' '+''''+ '+ CL.last_org_name)) as last_org_name , 
      Replace(ltrim(rtrim(ltrim(rtrim(isnull(CL.first_name,'+''''+' '+''''+') + '+''''+' '+''''+'+ isnull(CL.middle_name,'+''''+''+''''+'))) + '+''''+' '+''''+ '+ CL.last_org_name)), ''&'', ''-'') as LASTORGNAME , 
      Replace(CL.FULL_LEGAL_NAME, ''&'', ''-'') as FULL_LEGAL_NAME, 
      CA.ADDRESS_LINE1, 
      CA.TOWN_CITY + '+''''+' '+''''+' + ISNULL(CA.STATE_CODE,'+''''+''+''''+'), 
      CONVERT(VARCHAR(20), TERM.Term_Start_Date,101)+ '+''''+' - '+''''+' +CONVERT(VARCHAR(20),TERM.Term_End_Date,101), 
      Replace(CLAGENT.LAST_ORG_NAME, ''&'', ''-'') as LAST_ORG_NAME, 
      (Select SCREEN_NAME from CL_CLIENT where CL_CLIENT_PK=PM.ISSUECO_CLIENT_FK), 
      PRODUCT.Screen_Name, 
      PM.PO_POLICY_MASTER_PK' 
Set @NonUSAquery = ' 
    FROM dbo.PO_POLICY_MASTER PM 
    INNER JOIN CL_CLIENT CL 
    ON  PM.OWNER_CLIENT_FK = CL.CL_CLIENT_PK' 

IF ISNULL(@Lastname,'') <> '' 
    BEGIN 
     SET @USAquery = @USAquery + ' INNER JOIN CL_Client_Name ON CL.CL_CLIENT_PK = CL_CLIENT_NAME.CL_CLIENT_FK' 
     SET @USAquery = @USAquery + ' AND UPPER(CL_CLIENT_NAME.LAST_ORG_NAME_UCASE) LIKE UPPER(' 
     SET @USAquery = @USAquery + ''''+ @Lastname + '%'+ ''''+')' 
     SET @NonUSAquery = @NonUSAquery + ' INNER JOIN CL_Client_Name ON CL.CL_CLIENT_PK = CL_CLIENT_NAME.CL_CLIENT_FK' 
     SET @NonUSAquery = @NonUSAquery + ' AND UPPER(CL_CLIENT_NAME.LAST_ORG_NAME_UCASE) LIKE UPPER(' 
     SET @NonUSAquery = @NonUSAquery + ''''+ @Lastname + '%'+ ''''+')' 
    END 
IF ISNULL(@Firstname,'') <> '' 
    BEGIN 
     IF ISNULL(@Lastname,'') = '' 
      BEGIN 
       SET @USAquery = @USAquery + ' INNER JOIN CL_Client_Name ON CL.CL_CLIENT_PK = CL_CLIENT_NAME.CL_CLIENT_FK ' 
       SET @USAquery = @USAquery + ' AND UPPER(CL_CLIENT_NAME.FIRST_NAME_UCASE) LIKE UPPER(' 
       SET @USAquery = @USAquery + ''''+ @Firstname + '%'+ ''''+')' 
       SET @NonUSAquery = @NonUSAquery + ' INNER JOIN CL_Client_Name ON CL.CL_CLIENT_PK = CL_CLIENT_NAME.CL_CLIENT_FK ' 
       SET @NonUSAquery = @NonUSAquery + ' AND UPPER(CL_CLIENT_NAME.FIRST_NAME_UCASE) LIKE UPPER(' 
       SET @NonUSAquery = @NonUSAquery + ''''+ @Firstname + '%'+ ''''+')' 
      END 
     ELSE 
      BEGIN 
       SET @USAquery = @USAquery + ' AND UPPER(CL_CLIENT_NAME.FIRST_NAME_UCASE) LIKE UPPER(' 
       SET @USAquery = @USAquery + ''''+ @Firstname + '%'+ ''''+')' 
       SET @NonUSAquery = @NonUSAquery + ' AND UPPER(CL_CLIENT_NAME.FIRST_NAME_UCASE) LIKE UPPER(' 
       SET @NonUSAquery = @NonUSAquery + ''''+ @Firstname + '%'+ ''''+')' 
      END 
    END 
/* Commented by JB to address the issue that the default adress is billing address hence the policy is not getting diaplayed 
SET @USAquery = @USAquery + ' INNER JOIN CL_ADDRESS CA ON CL.CL_CLIENT_PK = CA.CL_CLIENT_FK and CA.Address_Type_Code = ''MAILING'' AND ISNULL(IS_USA,'+''''+'N'+''''+') = '+''''+'Y'+''''+'' */ 

SET @USAquery = @USAquery + ' INNER JOIN CL_ADDRESS CA ON CL.CL_CLIENT_PK = CA.CL_CLIENT_FK AND ISNULL(IS_USA,'+''''+'N'+''''+') = '+''''+'Y'+''''+'' 
SET @USAquery = @USAquery + ' INNER JOIN CL_Role_Client crc ON cl.CL_Client_PK = crc.Role_Client_FK AND crc.Source_FK = pm.PO_Policy_Master_PK AND crc.Role_Type_Code = ''POLICY'' AND crc.Role_Address_FK = ca.CL_Address_PK ' 
/* Commented by JB to address the issue that the default adress is billing address hence the policy is not getting diaplayed 
SET @NonUSAquery = @NonUSAquery + ' INNER JOIN CL_ADDRESS CA ON CL.CL_CLIENT_PK = CA.CL_CLIENT_FK and CA.Address_Type_Code = ''MAILING'' AND ISNULL(IS_USA,'+''''+'N'+''''+') = '+''''+'N'+''''+'' */ SET @NonUSAquery = @NonUSAquery + ' INNER JOIN CL_ADDRESS CA ON CL.CL_CLIENT_PK = CA.CL_CLIENT_FK AND ISNULL(IS_USA,'+''''+'N'+''''+') = '+''''+'N'+''''+'' 
SET @NonUSAquery = @NonUSAquery + ' INNER JOIN CL_Role_Client crc ON cl.CL_Client_PK = crc.Role_Client_FK AND crc.Source_FK = pm.PO_Policy_Master_PK AND crc.Role_Type_Code = ''POLICY'' AND crc.Role_Address_FK = ca.CL_Address_PK ' 

IF ISNULL(@City,'') <> '' 
    BEGIN 
     SET @USAquery = @USAquery + ' AND UPPER(CA.TOWN_CITY) LIKE UPPER(' 
     SET @USAquery = @USAquery + ''''+ @City + '%'+ ''''+')' 
     SET @NonUSAquery = @NonUSAquery + ' AND UPPER(CA.TOWN_CITY) LIKE UPPER(' 
     SET @NonUSAquery = @NonUSAquery + ''''+ @City + '%'+ ''''+')' 
    END 
SET @USAquery = @USAquery + ' INNER JOIN PO_RISK_MASTER RISK ON RISK.PO_POLICY_MASTER_FK = PM.PO_POLICY_MASTER_PK' 

SET @NonUSAquery = @NonUSAquery + ' INNER JOIN PO_RISK_MASTER RISK ON RISK.PO_POLICY_MASTER_FK = PM.PO_POLICY_MASTER_PK' 

IF ISNULL(@Address1,'') <> '' 
    BEGIN 
     SET @USAquery = @USAquery + ' AND UPPER(CA.ADDRESS_LINE1) LIKE UPPER(' 
     SET @USAquery = @USAquery + ''''+ '%' + @Address1 + '%'+ ''''+')' 
     SET @NonUSAquery = @NonUSAquery + ' AND UPPER(CA.ADDRESS_LINE1) LIKE UPPER(' 
     SET @NonUSAquery = @NonUSAquery + ''''+ '%' + @Address1 + '%'+ ''''+')' 
    END 
IF ISNULL(@HullID,'') <> '' 
    BEGIN 
     SET @USAquery = @USAquery + ' AND UPPER(RISK.RISK_EXTERNAL_ID) LIKE UPPER(' 
     SET @USAquery = @USAquery + ''''+ '%' + @HullID + '%'+ ''''+')' 
     SET @NonUSAquery = @NonUSAquery + ' AND UPPER(RISK.RISK_EXTERNAL_ID) LIKE UPPER(' 
     SET @NonUSAquery = @NonUSAquery + ''''+ '%' + @HullID + '%'+ ''''+')' 
    END 
SET @USAquery = @USAquery + ' INNER JOIN CL_COUNTRY_STATE CLSTATE ON CA.Country_Code = CLSTATE.CL_Country_Code AND CLSTATE.STATE_CODE = CA.STATE_CODE' 
IF ISNULL(@State,'') <> '' 
    BEGIN 
     SET @USAquery = @USAquery + ' AND UPPER(CLSTATE.STATE_NAME) LIKE UPPER(' 
     SET @USAquery = @USAquery + ''''+ @State + '%'+ ''''+')' 
     SET @NonUSAquery = @NonUSAquery + ' AND UPPER(CA.STATE_CODE) LIKE UPPER(' 
     SET @NonUSAquery = @NonUSAquery + ''''+ @State + '%'+ ''''+')' 
    END 
SET @USAquery = @USAquery + ' 
INNER JOIN PO_TERM_MASTER TERM 
ON  TERM.PO_POLICY_MASTER_FK = PM.PO_POLICY_MASTER_PK 
AND  TERM.PO_TERM_MASTER_PK = (SELECT max(po_term_master_pk) 
            FROM PO_TERM_MASTER 
            WHERE PO_TERM_MASTER.PO_POLICY_MASTER_FK = PM.po_policy_master_PK) 
LEFT OUTER JOIN PA_ACCOUNT_MASTER ACCT 
ON  ACCT.pa_account_master_pk = PM.PO_AGENT_ACCOUNT_FK 
LEFT OUTER JOIN CL_CLIENT CLAGENT 
ON  CLAGENT.cl_client_pk = ACCT.owner_client_fk 
INNER JOIN PR_PRODUCT PRODUCT 
ON  PRODUCT.PR_PRODUCT_PK = PM.PR_PRODUCT_FK 
WHERE 1=1 and PRODUCT.PR_Product_Code <> ''BBRENTAL'' ' 

SET @NonUSAquery = @NonUSAquery + ' 
INNER JOIN PO_TERM_MASTER TERM 
ON  TERM.PO_POLICY_MASTER_FK = PM.PO_POLICY_MASTER_PK 
AND  TERM.PO_TERM_MASTER_PK = (SELECT max(po_term_master_pk) 
            FROM PO_TERM_MASTER 
            WHERE PO_TERM_MASTER.PO_POLICY_MASTER_FK = PM.po_policy_master_PK) 
LEFT OUTER JOIN PA_ACCOUNT_MASTER ACCT 
ON  ACCT.pa_account_master_pk = PM.PO_AGENT_ACCOUNT_FK 
LEFT OUTER JOIN CL_CLIENT CLAGENT 
ON  CLAGENT.cl_client_pk = ACCT.owner_client_fk 
INNER JOIN PR_PRODUCT PRODUCT 
ON  PRODUCT.PR_PRODUCT_PK = PM.PR_PRODUCT_FK 
WHERE 1=1 and PRODUCT.PR_Product_Code <> ''BBRENTAL'' ' 

IF ISNULL(@Status,'') <> '' 
    BEGIN 
     IF ISNULL(@Status,'') <> 'ALL' 
      BEGIN 
       IF  ISNULL(@Status,'') = 'Quote' 
        BEGIN 
         SET @USAquery = @USAquery + 
         ' AND exists(
           select 0 
           from dbo.po_transaction pot 
           where pot.po_policy_master_fk = pm.po_policy_master_pk 
           and  pot.pr_tran_type_code = ''NEWBUSINESS'' 
           and  pot.transaction_cycle_code not in (''BOUND'',''VOIDED'',''ISSUED'',''BINDEREXPIRED''))' 

         SET @NonUSAquery = @NonUSAquery + 
         ' AND exists(
           select 0 
           from dbo.po_transaction pot 
           where pot.po_policy_master_fk = pm.po_policy_master_pk 
           and  pot.pr_tran_type_code = ''NEWBUSINESS'' 
           and  pot.transaction_cycle_code not in (''BOUND'',''VOIDED'',''ISSUED'',''BINDEREXPIRED''))' 

        END 
       ELSE IF ISNULL(@Status,'') = 'Bound' 
        BEGIN 
         SET @USAquery = @USAquery + 
         ' AND exists(
           select 0 
           from dbo.po_transaction pot 
           where pot.po_policy_master_fk = pm.po_policy_master_pk 
           and  pot.pr_tran_type_code = ''NEWBUSINESS'' 
           and  pot.transaction_cycle_code in (''BOUND'',''BINDEREXPIRED''))' 

         SET @NonUSAquery = @NonUSAquery + 
         ' AND exists(
           select 0 
           from dbo.po_transaction pot 
           where pot.po_policy_master_fk = pm.po_policy_master_pk 
           and  pot.pr_tran_type_code = ''NEWBUSINESS'' 
           and  pot.transaction_cycle_code in (''BOUND'',''BINDEREXPIRED''))' 
        END      
       ELSE 
        BEGIN 
         SET @USAquery = @USAquery + ' AND PM.policy_status_code=' 
         SET @USAquery = @USAquery + ''''+ @Status + ''''+'' 
         SET @NonUSAquery = @NonUSAquery + ' AND PM.policy_status_code=' 
         SET @NonUSAquery = @NonUSAquery + ''''+ @Status + ''''+'' 
        END 
      END 
    END 
IF ISNULL(@Accountpk,'') <> '' 
    BEGIN 
    IF ISNULL(@Accountpk,'') <> 'ALL' 
     BEGIN 
      SET @USAquery = @USAquery + ' AND PM.Po_Agent_Account_Fk in (' 
      SET @USAquery = @USAquery + ''''+ @Agentpk + ''''+')' 
      SET @NonUSAquery = @NonUSAquery + ' AND PM.Po_Agent_Account_Fk in (' 
      SET @NonUSAquery = @NonUSAquery + ''''+ @Agentpk + ''''+')' 
     END 
    END 
IF ISNULL(@Issuecopk,'') <> '' 
    BEGIN 
     IF ISNULL(@Issuecopk,'') <> 'ALL' 
      BEGIN 
       SET @USAquery = @USAquery + ' AND PM.ISSUECO_CLIENT_FK=' 
       SET @USAquery = @USAquery + ''''+ @Issuecopk + ''''+'' 
       SET @NonUSAquery = @NonUSAquery + ' AND PM.ISSUECO_CLIENT_FK=' 
       SET @NonUSAquery = @NonUSAquery + ''''+ @Issuecopk + ''''+'' 
      END 
    END 
IF ISNULL(@Productpk,'') <> '' 
    BEGIN 
     IF ISNULL(@Productpk,'') <> 'ALL' 
      BEGIN 
       SET @USAquery = @USAquery + ' AND PM.pr_product_fk=' 
       SET @USAquery = @USAquery + ''''+ @Productpk + ''''+'' 
       SET @NonUSAquery = @NonUSAquery + ' AND PM.pr_product_fk=' 
       SET @NonUSAquery = @NonUSAquery + ''''+ @Productpk + ''''+'' 
      END 
    END 
IF ISNULL(@UserType,'') = 'AGENT' 
    BEGIN 
     SET @USAquery = @USAquery + '      
      AND PM.PO_AGENT_ACCOUNT_FK IN(SELECT PA_ACCOUNT_MASTER_PK FROM PA_ACCOUNT_MASTER 
      WHERE OWNER_CLIENT_FK IN (SELECT AGENT_CLIENT_FK FROM AS_USER_AGENT 
      WHERE AS_USER_FK = '+''''+convert(varchar,@As_User_PK) + ''''+''+ '))' 

     SET @NonUSAquery = @NonUSAquery + ' 
      AND PM.PO_AGENT_ACCOUNT_FK IN(SELECT PA_ACCOUNT_MASTER_PK FROM PA_ACCOUNT_MASTER 
      WHERE OWNER_CLIENT_FK IN (SELECT AGENT_CLIENT_FK FROM AS_USER_AGENT 
      WHERE AS_USER_FK = '+''''+convert(varchar,@As_User_PK) + ''''+''+ '))' 

    END 
-- Create table #tblcount (Nofofrows numeric(18,0)) 

-- SET @Selectionquery = 'Insert into #tblcount select count(PM.PO_POLICY_MASTER_PK) ' + @USAquery + ' UNION ALL ' + 'select count(PM.PO_POLICY_MASTER_PK) ' + @NonUSAquery 

-- Exec(@Selectionquery) -- Set @errordesc = '' 

-- select @errordesc = Error_Description from screen_error_message where Error_No=5339 

-- If (select sum(Nofofrows) from #tblcount) > @TopRows -- Begin -- --Set @Selectionquery = 'Select ''NOTE'', '''', ''Too Many Rows Returned'', '''', '''', '''', '''', '''', '''', ''0''' -- Set @Selectionquery = 'Select ''NOTE'', ''>' + convert(varchar(3), @TopRows) + ' rows'', ''' + @errordesc +''', '''', '''', '''', '''', '''', '''', ''0''' -- Exec(@Selectionquery) -- End -- else -- Begin 

     Create table #tblpolicydata (
       POLICY_NO varchar(25), 
       POLICY_STATUS_CODE varchar(25), 
       LAST_ORG_NAME varchar(250), 
       FULL_LEGAL_NAME varchar(250), 
       ADDRESS_LINE1 varchar(250), 
       TOWN_CITY varchar(250), 
       TERM_DATES varchar(25), 
       AGENTLAST_ORG_NAME varchar(250), 
       ISSUECO varchar(250), 
       PRODUCT varchar(50), 
       PO_POLICY_MASTER_PK numeric(18,0)) 
     --MODIFIED BY SARATH FOR COMPATABILITY MODE ON JAN 15 2014 
/* SET @Selectionquery = 'Insert into #tblpolicydata ' + @USQueryColumns + ' ' + @USAquery + 
' UNION ALL ' + @NONUSQueryColumns + ' ' + @NonUSAquery + ' ORDER BY CL.LAST_ORG_NAME' */ SET @Selectionquery = 'Insert into #tblpolicydata ' + @USQueryColumns + ' ' + @USAquery + 
' UNION ALL ' + @NONUSQueryColumns + ' ' + @NonUSAquery + '' 

     Exec(@Selectionquery) 

     update #tblpolicydata 
     Set  POLICY_STATUS_CODE = (Select pot.transaction_cycle_code 
            From dbo.po_transaction pot 
            where pot.po_policy_master_fk = #tblpolicydata.PO_POLICY_MASTER_PK 
            and  pot.pr_tran_type_code = 'NEWBUSINESS') 
     where POLICY_STATUS_CODE = 'Prospect' 


     Select POLICY_NO, 
       upper(POLICY_STATUS_CODE) POLICY_STATUS_CODE, 
       LAST_ORG_NAME, 
       FULL_LEGAL_NAME, 
       ADDRESS_LINE1, 
       TOWN_CITY, 
       TERM_DATES, 
       AGENTLAST_ORG_NAME, 
       ISSUECO, 
       PRODUCT, 
       PO_POLICY_MASTER_PK 
     From #tblpolicydata 
     GROUP BY POLICY_NO, 
       upper(POLICY_STATUS_CODE), 
       LAST_ORG_NAME, 
       FULL_LEGAL_NAME, 
       ADDRESS_LINE1, 
       TOWN_CITY, 
       TERM_DATES, 
       AGENTLAST_ORG_NAME, 
       ISSUECO, 
       PRODUCT, 
       PO_POLICY_MASTER_PK 
     order by POLICY_NO 

     Drop table #tblpolicydata 
-- End -- Drop table #tblcount --Exec INSCS_ClientSearch '','','','','','','India','','','','','','' Set NOCOUNT OFF End 

它執行更多時間。如何減少時間?如何使用sql server減少存儲過程的時間?

+3

看看執行計劃,看看它在做,而不是僅僅在這裏張貼SQL大規模量,並希望別人會爲你 – dbajtr

+0

@CSK打破'存儲Procedure'到語句中的小塊並運行使用「實際執行計劃」查詢。嘗試在最常用的列上添加適當的「索引」,並檢查是否有任何正在發生的「表掃描」。 – Joby

+0

這裏需要執行更多的時間,我想減少執行時間。請 – CSK

回答

0

在等待電子郵件時,我能夠將其從動態查詢內容中轉換出來。每當你看到一個過濾器這樣的使用領域傳遞,9/10它總是將是更好的性能,以LEFT OUTER JOIN篩選器表和使用這樣的:

WHERE 
    (@FilterField1 IS NULL OR(MyTable.Field1 = @FilterField1)) 

你真的不需要該臨時處理您抓取主查詢中所需的字段。只需在主查詢中重新賦值給POLICY_STATUS_CODE。

同樣,不需要獲取MAX(po_term_master_pk)的子查詢,您有詳細的數據並且已經將您返回的結果分組了,爲什麼INNER JOIN中的子查詢?

您的狀態檢查會降低查詢速度。您已經擊中了主要查詢中的所有字段,然後按除狀態標誌以外的所有字段進行分組。只需使用計算字段,然後將它們彙總到外部查詢中。

下面發佈的代碼不會編譯,也不會爲您提供正確的數據,但是,您可能希望使用它來開始改進上面發佈的內容的性能。

SELECT 
    * 
FROM 
(
    SELECT 
     *, 
     BoundFlag = CASE WHEN MAX(BoundFlag) = 1 THEN 1 ELSE 0 END, 
     VoidedFlag = CASE WHEN MAX(VoidedFlag) = 1 THEN 1 ELSE 0 END, 
     IssuedFlag = CASE WHEN MAX(IssuedFlag) = 1 THEN 1 ELSE 0 END, 
     BinderExpiredFlag= CASE WHEN MAX(BinderExpiredFlag) =1 THEN 1 ELSE 0 END, 
     MaxPoTermMasterPK= max(po_term_master_pk) 
    FROM 
    (

     SELECT 

       BoundFlag = CASE WHEN pot.transaction_cycle_code ='BOUND' THEN 1 ELSE 0 END, 
       VoidedFlag = CASE WHEN pot.transaction_cycle_code ='VOIDED' THEN 1 ELSE 0 END, 
       IssuedFlag = CASE WHEN pot.transaction_cycle_code ='ISSUED' THEN 1 ELSE 0 END, 
       BinderExpiredFlag= CASE WHEN pot.transaction_cycle_code ='BINDEREXPIRED' THEN 1 ELSE 0 END, 
       HasProspectFlag = CASE WHEN POLICY_STATUS_CODE = 'Prospect' THEN 1 ELSE 0 END, 
       POLICY_STATUS_CODE = CASE WHEN POLICY_STATUS_CODE = 'NEWBUSINESS' THEN 'PROSPECT' ELSE POLICY_STATUS_CODE, 
       PM.POLICY_NO, 
       --MODIFIED BY SARATH FOR COMPATABILITY MODE ON JAN 15 2014 
       --ltrim(rtrim(ltrim(rtrim(isnull(CL.first_name,'+''''+' '+''''+') + '+''''+' '+''''+'+ isnull(CL.middle_name,'+''''+''+''''+'))) + '+''''+' '+''''+ '+ CL.last_org_name)) as last_org_name , 
       Replace(ltrim(rtrim(ltrim(rtrim(isnull(CL.first_name,'+''''+' '+''''+') + '+''''+' '+''''+'+ isnull(CL.middle_name,'+''''+''+''''+'))) + '+''''+' '+''''+ '+ CL.last_org_name)), ''&'', ''-'') as LASTORGNAME , 
       Replace(CL.FULL_LEGAL_NAME, ''&'', ''-'') as FULL_LEGAL_NAME, 
       CA.ADDRESS_LINE1, 
       CA.TOWN_CITY + '+''''+' '+''''+' + ISNULL(CLSTATE.STATE_NAME,CA.STATE_CODE), 
       CONVERT(VARCHAR(20), TERM.Term_Start_Date,101)+ '+''''+' - '+''''+' +CONVERT(VARCHAR(20),TERM.Term_End_Date,101), 
       Replace(CLAGENT.LAST_ORG_NAME, ''&'', ''-'') as LAST_ORG_NAME, 
       (Select SCREEN_NAME from CL_CLIENT where CL_CLIENT_PK=PM.ISSUECO_CLIENT_FK), 
       PRODUCT.Screen_Name, 
       PM.PO_POLICY_MASTER_PK 
       FROM 
       dbo.PO_POLICY_MASTER PM 
       INNER JOIN dbo.PO_POLICY_MASTER PM ON PM.<PrimaryKey>=FlagDetail.<PrimaryKey> 
       INNER JOIN CL_CLIENT CL ON  PM.OWNER_CLIENT_FK = CL.CL_CLIENT_PK 
       LEFT OUTER JOIN CL_Client_Name ON CL.CL_CLIENT_PK = CL_CLIENT_NAME.CL_CLIENT_FK 
       LEFT OUTER JOIN CL_ADDRESS CA ON CL.CL_CLIENT_PK = CA.CL_CLIENT_FK IS_USA='Y' --YOU DNOT NEED IS NULL ISNULL(IS_USA,'+''''+'N'+''''+') = '+''''+'Y'+''' 
       LEFT OUTER JOIN CL_Role_Client crc_us ON cl.CL_Client_PK = crc.Role_Client_FK AND crc.Source_FK = pm.PO_Policy_Master_PK AND crc.Role_Type_Code = 'POLICY' AND crc.Role_Address_FK = ca.CL_Address_PK 
       --YOU DONT NEED TO JOIN AGAIN FOR NON US - YOU ARE USING THE SAME CONDITION LEFT OUTER JOIN CL_Role_Client crc_us ON cl.CL_Client_PK = crc.Role_Client_FK AND crc.Source_FK = pm.PO_Policy_Master_PK AND crc.Role_Type_Code = 'POLICY' AND crc.Role_Address_FK = ca.CL_Address_PK 
       INNER JOIN PO_RISK_MASTER RISK ON RISK.PO_POLICY_MASTER_FK = PM.PO_POLICY_MASTER_PK 
       LEFT OUTER JOIN CL_COUNTRY_STATE CLSTATE ON CA.Country_Code = CLSTATE.CL_Country_Code AND CLSTATE.STATE_CODE = CA.STATE_CODE 
       /* SEE COMMENTS - TRY TO AVOID A SUBQUERY IN YOUR JOINS ! 
       INNER JOIN PO_TERM_MASTER TERM ON TERM.PO_POLICY_MASTER_FK = PM.PO_POLICY_MASTER_PK 
         --You could replace this subquery below with a master subquery reducing burden on the join 
         AND  TERM.PO_TERM_MASTER_PK = 
         (
          SELECT max(po_term_master_pk) 
          FROM PO_TERM_MASTER 
          WHERE PO_TERM_MASTER.PO_POLICY_MASTER_FK = PM.po_policy_master_PK 
         ) 
       */ 
       LEFT OUTER JOIN PA_ACCOUNT_MASTER ACCT ON ACCT.pa_account_master_pk = PM.PO_AGENT_ACCOUNT_FK 
       LEFT OUTER JOIN CL_CLIENT CLAGENT ON CLAGENT.cl_client_pk = ACCT.owner_client_fk 
       INNER JOIN PR_PRODUCT PRODUCT ON PRODUCT.PR_PRODUCT_PK = PM.PR_PRODUCT_FK 
       LEFT OUTER JOIN dbo.po_transaction pot ON pot.po_policy_master_fk = pm.po_policy_master_pk and pot.pr_tran_type_code = 'NEWBUSINESS' 
      WHERE 
       (@LastName IS NULL OR (CL_CLIENT_NAME.LAST_ORG_NAME_UCASE LIKE @Lastname + '%')) --Check your collation - I bet you dont need UCASE 
       AND 
       (@FisrtName IS NULL OR (CL_CLIENT_NAME.FIRST_ORG_NAME_UCASE LIKE @Fisrtname + '%'))--Check your collation - I bet you dont need UCASE 
       AND 
       (@City IS NULL OR (CA.TOWN_CITY LIKE @City + '%') -- You probally dont need UPPERCASE HERE Check your collation 
       AND 
       (@Address1 IS NULL OR(CA.ADDRESS_LINE1 LIKE '%' [email protected] + '%')) 
       AND 
       (@HullID IS NULL OR(RISK.RISK_EXTERNAL_ID LIKE '%' + @HullID + '%')) 
       AND 
       (@StateID IS NULL OR(CLSTATE.STATE_NAME LIKE @State + '%')) 
       AND 
       (1=1 and PRODUCT.PR_Product_Code <> 'BBRENTAL') --WHats with the 1=1? 
       AND 
       (@UserType<>'AGENT' OR(PM.PO_AGENT_ACCOUNT_FK IN(SELECT PA_ACCOUNT_MASTER_PK FROM PA_ACCOUNT_MASTER WHERE OWNER_CLIENT_FK IN (SELECT AGENT_CLIENT_FK FROM AS_USER_AGENT WHERE AS_USER_FK = convert(varchar,@As_User_PK)))) 
       AND 
       ((@Accountpk IS NULL OR @Accountpk='ALL') OR(PM.Po_Agent_Account_Fk [email protected])) 
       AND 
       ((@Issuecopk IS NULL OR @Issuecopk='ALL') OR(PM.ISSUECO_CLIENT_FK [email protected])) 
       AND 
       ((@Productpk IS NULL OR @Productpk='ALL') OR(PM.pr_product_fk [email protected])) 

    )AS DETAIL 
    GROUP BY 
     PM.POLICY_NO, 
     PM.POLICY_STATUS_CODE, 
     LASTORGNAME , 
     FULL_LEGAL_NAME, 
     CA.ADDRESS_LINE1, 
     CA.TOWN_CITY, 
     CLSTATE.STATE_NAME, 
     CA.STATE_CODE, 
     TERM.Term_Start_Date, 
     TERM.Term_End_Date 
     CLAGENT.LAST_ORG_NAME, 
     LAST_ORG_NAME, 
     PM.ISSUECO_CLIENT_FK, 
     PRODUCT.Screen_Name, 
     PM.PO_POLICY_MASTER_PK, 
     pr_tran_type_code 
)AS SUMMARY 
WHERE 
    (PO_TERM_MASTER_PK = MaxPoTermMasterPK) 
    AND 
    (
     (@Status IS NULL) 
     OR 
     (
      (@Status ='Quote' AND (IsBound + IsVoided + IsIssued + IsBinderExipired = 0)) 
      OR 
      (@Status ='Bound' AND (IsBound + IsBinderExipired > 0)) 
     ) 
    ) 
ORDER BY 
    POLICY_NO