2013-10-15 36 views
0

嘗試修改現有視圖。它目前在我的數據庫上返回32行。下面的代碼:修改SQL視圖/添加列而不加入

ALTER VIEW [dbo].[vw_fnd_la_Statement] 
AS 

SELECT  
    SH.lease_id, S.expense_id, SH.statement_header_id, S.statement_id AS row_id, 
    EC.name AS expense_category, SH.period, S.invoice_number, 
    S.received_date, S.due_date, S.landlord_expense_total, S.prorata_share, 
    S.tenant_expense_total, S.tenant_admin_fee, S.paid_estimates, S.net_due, 
    CASE 
     WHEN s.status = 'O' THEN 'Open' 
     WHEN s.status = 'P' THEN 'In Progress' 
     WHEN s.status = 'D' THEN 'In Dispute' 
     WHEN s.status = 'C' THEN 'Closed' 
     ELSE NULL 
    END AS status, S.approval, 
    dbo.UDF_getExpenseVendor(S.expense_id) AS vendor, S.approved_amount, 
    S.approved_payment_amount, S.disputed_amount, S.held_amount, S.statement_id, 
    EC.expense_category_id, SH.start_date, SH.end_date, S.status AS status_id 
FROM  
    la_tbl_statement_header AS SH 
INNER JOIN 
    la_tbl_statement AS S ON SH.statement_header_id = S.statement_header_id 
INNER JOIN 
    la_tlu_expense_category AS EC ON S.expense_category_id = EC.expense_category_id 
WHERE  
    (SH.IsDeleted = 0) AND (S.IsDeleted = 0) AND (EC.IsDeleted = 0) 

我已經有了第四臺名爲la_tbl_expense_cap_setup有有效日期列,並且在la_tbl_statement表匹配費用ID費用ID。我想要的是所有現有視圖的結果,以及生效日期的新列。一些費用沒有大寫字母,因此該行在生效日期列中應該爲NULL。我試過加入費用ID,但我得到了19行的子集。

回答

0

使用左外連接會給你所有表中的結果,即使在沒有在第4臺

0

嘗試對左外連接在第四臺。

ALTER VIEW [dbo].[vw_fnd_la_Statement] 
    AS 

    SELECT  SH.lease_id, S.expense_id, SH.statement_header_id, S.statement_id AS row_id,   EC.name AS expense_category, SH.period, S.invoice_number, 
      S.received_date, S.due_date, S.landlord_expense_total, S.prorata_share, S.tenant_expense_total, S.tenant_admin_fee, S.paid_estimates, S.net_due, 
      CASE WHEN s.status = 'O' THEN 'Open' WHEN s.status = 'P' THEN 'In Progress' WHEN s.status = 'D' THEN 'In Dispute' WHEN s.status = 'C' THEN 'Closed' ELSE 
      NULL END AS status, S.approval, dbo.UDF_getExpenseVendor(S.expense_id) AS vendor, S.approved_amount, S.approved_payment_amount, 
      S.disputed_amount, S.held_amount, S.statement_id, EC.expense_category_id, SH.start_date, SH.end_date, S.status AS status_id, esc.effective_date 
    FROM  
      la_tbl_statement_header AS SH INNER JOIN 
      la_tbl_statement AS S ON SH.statement_header_id = S.statement_header_id INNER JOIN 
      la_tlu_expense_category AS EC ON S.expense_category_id = EC.expense_category_id 
      left outer join la_tbl_expense_cap_setup as ecson esc.expense_id = s.expense_id 
    WHERE  (SH.IsDeleted = 0) AND (S.IsDeleted = 0) AND (EC.IsDeleted = 0) 
+0

我認爲你有一個錯字。你的意思是? 'la_tbl_expense_cap_setup AS ECS ON ECS.expense_id = S.expense_id'。這會返回47個結果。我只需要原始視圖的結果,其中包含有效日期或NULL的附加列。 – user2414509

+0

是的 - 那是一個類型錯誤。我在示例中修復了它。如果你只需要原始的32條記錄,也許內部連接會做,但ESC中的費用不能爲空或它會限制你的記錄集小於32.試試看。這只是一個猜測,因爲我不知道ESC和其他表格的字段和關係。 – bsivel

0

OK LEFT OUTER JOIN大部分是正確的。我只需將'AND(ECS.IsDeleted = 0)'添加到新連接以使其正常工作。我原本在WHERE子句中有AND,它只返回具有生效日期的行。這是正確的代碼。謝謝您的幫助。

SELECT  SH.lease_id, S.expense_id, SH.statement_header_id, S.statement_id AS row_id, EC.name AS expense_category, SH.period, S.invoice_number, 
     S.received_date, S.due_date, S.landlord_expense_total, S.prorata_share, S.tenant_expense_total, S.tenant_admin_fee, S.paid_estimates, S.net_due, 
     CASE WHEN s.status = 'O' THEN 'Open' WHEN s.status = 'P' THEN 'In Progress' WHEN s.status = 'D' THEN 'In Dispute' WHEN s.status = 'C' THEN 'Closed' ELSE 
     NULL END AS status, S.approval, dbo.UDF_getExpenseVendor(S.expense_id) AS vendor, S.approved_amount, S.approved_payment_amount, 
     S.disputed_amount, S.held_amount, S.statement_id, EC.expense_category_id, SH.start_date, SH.end_date, S.status AS status_id, 
     ECS.effective_date AS cap_eff_date 
FROM  
     la_tbl_statement_header AS SH INNER JOIN 
     la_tbl_statement AS S ON SH.statement_header_id = S.statement_header_id INNER JOIN 
     la_tlu_expense_category AS EC ON S.expense_category_id = EC.expense_category_id left outer join 
     la_tbl_expense_cap_setup AS ECS ON s.expense_id = ECS.expense_id AND (ECS.IsDeleted = 0) 
WHERE  (SH.IsDeleted = 0) AND (S.IsDeleted = 0) AND (EC.IsDeleted = 0)