2015-07-23 8 views
0

У меня есть две таблицы SQL с одинаковыми структурами. Первый столбец - уникальный индекс с именем «opt», второй столбец - «val».SQL для копирования отсутствующих данных из одной таблицы в другую

В table1 заполняется значениями по умолчанию, например:

opt val 
path /tmp 
file myfile.txt 
day tuesday 
time 11:00 

Вторая таблица, table2 будет содержать те же строки, но некоторые из значений столбца Вэл может отсутствовать, например:

opt val 
path /var/tmp 
file 
day 
time 16:30 

Я хотел бы пройти через каждую строку в таблице2 и сказать: «Есть ли значение в столбце val? если нет, то получить от Вэла table1 и обновление table2, поэтому таблица 2 будет в конечном итоге, как:

opt val 
path /var/tmp 
file myfile.txt 
day tuesday 
time 16:30 

т.е. заполнить недостающие данные из table1.

Я ищу чисто SQL способ сделать это (т.е. без использования PHP, ASP и т. Д.).

Я знаком с синтаксисом IF/ELSE в SQL, но я не уверен, как я повторяю каждую строку в таблице. Может ли кто-нибудь завести меня в правильном направлении, пожалуйста?

+0

Ответ зависит от вашего типа БД. Я думаю, что в большинстве БД (postgresql, mysql ...) вам нужно написать процедуру, которая читает анализ и запись diff. – michaelbn

+1

В некоторых версиях SQL используется концепция «MERGE», которая может обновляться или вставляться по мере необходимости; поочередно некоторые поддерживают «MINUS» или «EXCEPT», которые могут быть использованы для быстрого определения отсутствующих значений и из которых вы можете предварительно подготовить обновление. Итак, что такое РСУБД? И какой SQL вы попробовали? – xQbert

ответ

1

Что вам нужно, чтобы запустить обновление, похожий на те ниже:

SQL Server:

UPDATE T2 
SET T2.val = T1.val 
    , T2.opt = T1.opt 
FROM Table2 T2 
    LEFT JOIN Table1 T1 
     ON T2.opt = T1.opt 
      OR T2.val = T1.val 
WHERE T2.opt IS NULL 
    OR T2.val IS NULL 

MySQL:

UPDATE Table2 T2 
    JOIN Table1 T1 ON T2.opt = T1.opt 
    OR T2.val = T1.val 
SET T2.val = T1.val 
    , T2.opt = T1.opt 
WHERE T2.VAL IS NULL 
    OR T2.OPT IS NULL; 

Взгляните ниже SQLFiddles, чтобы понять, что это делает с вашими данными.

Выдача варианта вышеуказанного запроса для просмотра значений NULL в вашем table2. Посмотрите here.

Чтобы обновить эти значения, просто запустите запрос UPDATE, чтобы изменить данные в таблице.

Посмотрите на this SQLFiddle, чтобы узнать, что будет результатом UPDATE. Это один из вариантов, представленных выше, и возвратит измененные данные от table2.

0

sql cursor - это то, что вы ищете. Вы можете проверить некоторые онлайн-уроки для будущих потребностей, но вот пример.

DECLARE 
    c_opt table2.opt%type; //variable to be used for selecting into 
    c_name table2.val%type; // variable to be used for selecting into 
    CURSOR c_table2 is  // the actual cursor 
     SELECT opt,val FROM table2; 
BEGIN 
    OPEN c_customers; 
    LOOP 
     FETCH c_table2 into c_opt, c_val ; 
     EXIT WHEN c_customers%notfound; 
     IF (c_val is null) THEN UPDATE table 2 set val = (Select val from table 1 where opt = c_opt); 
    END LOOP; 
    CLOSE c_customers; 
END; 

Сообщите нам, если это сработает, с наилучшими пожеланиями.

+0

Я бы не попробовал [** 'RBAR' **] (https://www.simple-talk.com/sql/t-sql-programming/rbar--row-by-agonizing-row/) подход –

Смежные вопросы