2017-08-07 55 views
0

我正在構建一個腳本,用於檢查添加到表中的四個新列中的不準確數據輸入。其中三個檢查相對簡單,但第四個檢查的字段是一個標誌列(t/f),其值根據兩個標準確定:表中的Start Date小於今天的日期,另一個表中的變量具有具體的價值。爲了做這個檢查,我創建了一個虛擬表,基本上用一個唯一的ID重新創建了標誌列,然後我加入了我想要檢查並查找差異的表上的虛擬表。我問的是如果有辦法直接進行檢查而不必創建一個虛擬表。我已經嘗試了一些東西,但是我的SQL技能並不是非常先進的。檢查差異而無需先創建虛擬表

我目前正在使用的代碼如下:

CREATE TABLE check_is_billable 
AS 
SELECT csv.service_line_items.id AS service_line_items_id, 
    csv.media_plans.id AS media_plan_id, 
    cast(csv.service_line_items.start_date AS DATE) < CURRENT_DATE AND csv.media_plans.aasm_state = 'approved' AS is_billable_check 
FROM csv.service_line_items 
INNER JOIN csv.media_plans ON csv.service_line_items.media_plan_id = csv.media_plans.id 
ORDER BY service_line_items_id; 

SELECT 
    'Is Billable Check' AS test, 
    COUNT(*) AS error_count 
FROM csv.check_is_billable 
INNER JOIN csv.service_line_items ON (csv.service_line_items.id = csv.check_is_billable.service_line_items_id 
    AND csv.check_is_billable.media_plan_id = csv.service_line_items.media_plan_id 
    AND csv.check_is_billable.is_billable_check != cast(csv.service_line_items.is_billable AS BOOLEAN)); 

DROP TABLE check_is_billable; 

基本上,我想知道,如果有,我可以修改的中間步驟,使得我沒有創建和刪除虛擬表的方式。

+1

您正在使用什麼RDBMS? (SQL Server,Oracle,DB2,MySQL,Postgresql等),您可以使用簡單的子查詢或公用表表達式來完成此操作。 – xQbert

+2

另外,提供樣本數據和期望的結果。 –

+0

我正在使用Postgresql –

回答

1

你可以做direcly不使用創建和刪除,但用DINAMIC表

SELECT ' 
    Is Billable Check' AS test 
    , COUNT(*) AS error_count 
    FROM (
    SELECT 
     csv.service_line_items.id AS service_line_items_id 
     , csv.media_plans.id AS media_plan_id 
     , cast(csv.service_line_items.start_date AS DATE) < CURRENT_DATE 
       AND csv.media_plans.aasm_state = 'approved' AS is_billable_check 
     FROM csv.service_line_items 
    INNER JOIN csv.media_plans ON csv.service_line_items.media_plan_id = csv.media_plans.id 
) T INNER JOIN csv.service_line_items ON 
     (csv.service_line_items.id = t.service_line_items_id 
      AND T.media_plan_id = csv.service_line_items.media_plan_id 
       AND T.is_billable_check != cast(csv.service_line_items.is_billable AS BOOLEAN));