2015-05-07 4 views
1

У меня есть этот запрос ниже. Мне нравится вставлять, только если строка отсутствует в таблице 1. Как я могу это сделать?INSERT INTO SELECT, если НЕ СУЩЕСТВУЕТ В ОРАНСЕК

INSERT INTO TABLE1 (VEH_YEAR, VEH_MAKE, ACV_VOLUME) 
SELECT VEH_YEAR, VEH_MAKE, 
(SELECT COUNT(*) 
FROM ACV_VEHICLE_DETAILS 
WHERE YEAR  = table2 .veh_year 
AND MAKE  = table2 .veh_make 
) AS ACV_VOLUME 
FROM TABLE2 table2 WHERE VEH_YEAR IS NOT NULL AND VEH_MAKE IS NOT NULL; 
+0

ли левый присоединиться на таблица 1 и фильтр для нулей –

ответ

0

Использование not exists:

INSERT INTO TABLE1 (VEH_YEAR, VEH_MAKE, ACV_VOLUME) 
    SELECT VEH_YEAR, VEH_MAKE, 
      (SELECT COUNT(*) 
      FROM ACV_VEHICLE_DETAILS vd 
      WHERE vd.YEAR = t2.veh_year AND vd.MAKE = t2.veh_make 
      ) AS ACV_VOLUME 
    FROM TABLE2 t2 
    WHERE VEH_YEAR IS NOT NULL AND VEH_MAKE IS NOT NULL AND 
      NOT EXISTS (SELECT 1 
         FROM table1 t1 
         WHERE t1.veh_year = t2.veh_year and t1.veh_make = t2.veh_make 
        ); 
+0

Я все еще вижу несколько строк «1981 \t CHEVROLET \t 0 "в моем выбранном запросе – yalkris

+0

Строки, по-видимому, не являются точными дубликатами. Скорее всего, у 'veh_make' есть дополнительные символы. –

0

Вы можете использовать NOT EXISTS так:

INSERT INTO TABLE1 (VEH_YEAR, VEH_MAKE, ACV_VOLUME) 
SELECT VEH_YEAR 
     , VEH_MAKE 
     , (SELECT COUNT(*) 
      FROM  ACV_VEHICLE_DETAILS 
      WHERE  YEAR = t2.veh_year 
       AND MAKE = t2.veh_make 
     ) AS ACV_VOLUME 
FROM TABLE2 t2 
WHERE VEH_YEAR IS NOT NULL 
    AND VEH_MAKE IS NOT NULL 
    AND NOT EXISTS (SELECT 1 
        FROM Table1 t1 
        WHERE t1.VEH_YEAR = t2.VEH_YEAR 
         AND t1.VEH_MAKE = t2.VEH_MAKE 
        ); 

Это предполагает, что вы хотите, чтобы исключить только тогда, когда оба VEH_MAKE и VEH_YEAR уже присутствуют, если вы хотите исключить из INSERT все записи, основанные на VEH_MAKE, только вы просто измените корреляцию тин WHERE критерии, за исключением t1.VEH_YEAR = t2.VEH_YEAR

0

Классический LEFT JOIN:

INSERT INTO TABLE1 (VEH_YEAR, VEH_MAKE, ACV_VOLUME) 
SELECT VEH_YEAR, VEH_MAKE, ACV_VOLUME 
FROM(SELECT VEH_YEAR, VEH_MAKE, 
      (SELECT COUNT(*) 
      FROM ACV_VEHICLE_DETAILS 
      WHERE YEAR = table2.veh_year 
      AND MAKE = table2.veh_make) AS ACV_VOLUME 
    FROM TABLE2 table2 WHERE VEH_YEAR IS NOT NULL AND VEH_MAKE IS NOT NULL 
    )t 
LEFT JOIN TABLE1 t1 on t.VEH_YEAR = t1.VEH_YEAR AND t.VEH_MAKE = t1.VEH_MAKE AND t.ACV_VOLUME = t1.ACV_VOLUME 
WHERE t1.VEH_YEAR IS NULL 
0

Вы можете использовать MERGE с WHEN NOT MATCHED THEN INSERT:

merge into Table1 t 
using (
    SELECT VEH_YEAR, VEH_MAKE, 
    (SELECT COUNT(*) 
    FROM ACV_VEHICLE_DETAILS 
    WHERE YEAR  = table2 .veh_year 
    AND MAKE  = table2 .veh_make 
    ) AS ACV_VOLUME 
    FROM TABLE2 table2 WHERE VEH_YEAR IS NOT NULL AND VEH_MAKE IS NOT NULL 
) d 
on (t.veh_year = d.veh_year and t.veh_make = d.veh_make) 
when not matched then insert (veh_year, veh_make, acv_volume) 
         values (d.veh_year, d.veh_make, d.acv_volume); 

Не забудьте совершить :)