2017-08-07 2 views
0

テーブルに追加された4つの新しい列の間で不正確なデータ入力をチェックするスクリプトを作成しています。これらの3つのチェックは比較的単純ですが、チェックする第4のフィールドはフラグの列(t/f)です。その値は2つの基準で決定されます。テーブル自体の開始日が今日の日付よりも短く、特定の値。このチェックを行うために、基本的に一意の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 other?)では、単純なサブクエリや共通のテーブル式を使用してこれを実現できます。 – xQbert

+2

また、サンプルデータと望ましい結果を提供してください。 –

+0

私はPostgreSQLを使用しています –

答えて

1
あなたが作成し使用しなくても直接使う行うことができます

とドロップが、動のテーブルを使用して

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)); 
関連する問題