2014-11-20 3 views
0

таблица 1SQL Вставить в (Выберите из списка)

ID    Qty  completed_qty KEY 
1    2   1    a 
2    3   1    b 
3    4   3    c 

таблица 2

ID    Qty  completed_qty Percent  Priority   KEY 
1    2   1   50   H    a 
2    3   1   33.33  L    b 
3    4   3   75   H    c 

Я есть 2 таблицы, которые я выбираю таблицу 1, а затем вставить в таблицу 2, используя скрипт ниже

INSERT into table2(Qty, Completed_qty, Percent, KEY) 
select Qty, Completed_qty, (completed_qty/Qty) * 100 [Percent], KEY from table1 where 
KEY not in (select table2.KEY from table2) 

Итак, когда каждый раз, когда я выполняю сценарий, одна и та же запись не копируется в таблицу2.
Я столкнулся с проблемой, когда Процент из таблицы1 изменяется, я хочу обновить и Процент в таблице 2, я меняю сценарий ниже, но не могу его сделать.

INSERT into table2(Qty, Completed_qty, Percent, KEY) 
select Qty, Completed_qty, (completed_qty/Qty) * 100 [Percent], KEY from table1 where 
KEY not in (select table2.KEY from table2) 
and (completed_qty/Qty) * 100 <> (select table2.Percent from table2) 

Я получаю ошибку, как показано ниже:

Subquery вернулся более чем на 1 значение. Это недопустимо, если подзапрос следует за =,! =, <, < =,>,> = или когда подзапрос используется в качестве выражения

Любой, что сделал аналогичный скрипт раньше. Любая идея, как я могу это сделать?

ответ

0

Это ваш запрос:

insert into table2(Qty, Completed_qty, Percent, KEY) 
    select Qty, Completed_qty, (completed_qty/Qty) * 100 [Percent], KEY 
    from table1 
    where KEY not in (select table2.KEY from table2) and 
      (completed_qty/Qty) * 100 <> (select table2.Percent from table2) 
-----------------------------------------^ 

Второй подзапрос является проблемой. Я подозреваю, что вы хотите not in:

insert into table2(Qty, Completed_qty, Percent, KEY) 
    select Qty, Completed_qty, (completed_qty/Qty) * 100 [Percent], KEY 
    from table1 
    where KEY not in (select table2.KEY from table2) and 
      (completed_qty/Qty) * 100 not in (select table2.Percent from table2 where table2.Percent is not null) 

Дополнительное is not null важно при использовании not in. В противном случае значение NULL в table2.Percent будет обрабатывать каждую строку для фильтрации.

+0

ошибка все еще же, когда я изменяю <> –

+0

К сожалению, после того, как изменения в NOT IN, там не записано, была вставка –

0

Вы можете использовать пункт NOT IN там также говорят

and (completed_qty/Qty) * 100 NOT IN (select table2.Percent from table2) 

EDIT:

Вы можете, вероятно, вставить NULL в Percent колонке, как показано ниже

INSERT into table2(Qty, Completed_qty, Percent, KEY) 
select Qty, 
Completed_qty, 
null, 
KEY 
from table1 
where KEY not in (select table2.KEY from table2) 

Позже затем выполнить команду UPDATE

UPDATE table2 a 
    JOIN table1 b ON a.key = b.key 
SET a.Percent = (b.completed_qty/b.Qty) * 100 
WHERE a.Percent IS NULL 
+0

После изменения в NOT IN, нет записи были вставлены –

+0

, цель - вставить данные, выбранные в новую таблицу. И запись вставки не будет вставляться снова, но потребуется обновление процента. Таким образом, использование OR приведет к дублированию данных? –

+0

@DerickLoo, тогда вы должны выполнять операцию «ОБНОВЛЕНИЕ». почему вы упомянули «INSERT» в почте? – Rahul

0

Вы получаете ошибку, потому что в подзапросе возвращается несколько результатов. Вы можете использовать NOT IN вместо <>.

Однако, исходя из вашего заявления, I want update also the Percent in table 2. похоже, что вы хотите обновить table2, если table1 изменен, и ключ уже существует в table2. В этом случае вам необходимо использовать UPDATE запрос для этого вместо:

UPDATE table2 t2 
JOIN table1 t1 on t2.key = t1.key 
SET Percent = t1.completed_qty/t1.Qty * 100 
+0

Привет sgeddes, если моя таблица 2 пуста и сначала запускается, как я могу ее выполнить? Мне нужно запустить два разных запроса. Сначала вставляем с помощью select. Затем запустить второй запрос - обновление? –

+0

@DerickLoo - правильно, похоже, что вы хотите вставить записи, которые не существуют, и обновить те, которые существуют. Для этого вы можете использовать 2 отдельных оператора, или вы можете использовать 'upsert', если это ваш первичный ключ (не похоже, что он есть): http://stackoverflow.com/questions/6107752/how-to- Выполнять-up-up-so-that-i-can-use-both-new-and-old-values-in-update-par – sgeddes

+0

В JOIN, t2 и at on есть неправильный синтаксис. –

0

, если таблица имеет много строк, ваш запрос будет медленным.

попробовать это одно:

Insert into table2(Qty, Completed_qty, Percent, KEY) 
Select a.Qty, a.Completed_qty, (a.completed_qty/a.Qty) * 100 [Percent], a.KEY 
From table1 a 
Left Join table2 b On b.KEY = a.KEY 
Where b.KEY is Null 
    Or 
    (b.KEY is Not Null and ((a.completed_qty/a.Qty) * 100) <> b.Percent) 
Смежные вопросы