Легким ответом является переадресация после done
, а не на printf
:
for key in "${!array[@]}"; do
value=${array[$key]}
[[ $key = *[$'\t\n']* ]] && continue # security: disallow keys with tabs or newlines
[[ $value = *[$'\n']* ]] && continue # security: disallow values with newlines
printf "%s\t%s\n" "$i" "${array[$i]}"
done >outfile
Обратите внимание на эти проверки - я не делаю их позже в этом коде , но они необходимы, чтобы позволить в вашем формате вводить другие пары ключ / значение или позволять «значениям» фактически указывать другие ключи.
Таким образом, чтобы заменить весь файл сразу , для обеспечения атомарности следует использовать шаблон записи и переименования. Общий шаблон:
tempfile=$(mktemp outfile.XXXXXX)
write_your_data >"$tempfile"
mv -- "$tempfile" outfile
write_your_data
не обязательно должен быть заполнителем - он также может быть функцией, инкапсулирующей сам цикл:
write_your_data() {
local i
for i in "${!array[@]}"; do
printf "%s\t%s\n" "$i" "${array[$i]}"
done
}
Этот синтаксис недействителен в Oracle. Вы можете сделать это:
UPDATE table1 SET table1.value = (SELECT table2.CODE
FROM table2
WHERE table1.value = table2.DESC)
WHERE table1.UPDATETYPE='blah'
AND EXISTS (SELECT table2.CODE
FROM table2
WHERE table1.value = table2.DESC);
Или вы могли бы быть в состоянии сделать это:
UPDATE
(SELECT table1.value as OLD, table2.CODE as NEW
FROM table1
INNER JOIN table2
ON table1.value = table2.DESC
WHERE table1.UPDATETYPE='blah'
) t
SET t.OLD = t.NEW
(Это зависит от того, рассматривается ли встроенное представление обновляется Oracle).
UPDATE table1 t1
SET t1.value =
(select t2.CODE from table2 t2
where t1.value = t2.DESC)
WHERE t1.UPDATETYPE='blah';
Как указано здесь , общий синтаксис для первого решения, предложенный Тони Эндрюсом, это:
update some_table s
set (s.col1, s.col2) = (select x.col1, x.col2
from other_table x
where x.key_value = s.key_value
)
where exists (select 1
from other_table x
where x.key_value = s.key_value
)
Я думаю, что это интересно, особенно если вы хотите обновить более одного поле. [/ д2]
update table1 a
set a.col1='Y'
where exists(select 1
from table2 b
where a.col1=b.col1
and a.col2=b.col2
)
Не используйте некоторые из приведенных выше ответов.
Некоторые предлагают использовать вложенный SELECT, не делайте этого, это мучительно медленно. Если у вас есть много записей для обновления, используйте join, поэтому что-то вроде:
update (select bonus
from employee_bonus b
inner join employees e on b.employee_id = e.employee_id
where e.bonus_eligible = 'N') t
set t.bonus = 0;
См. Эту ссылку для получения более подробной информации. http://geekswithblogs.net/WillSmith/archive/2008/06/18/oracle-update-with-join-again.aspx .
Кроме того, убедитесь, что есть первичные ключи на всех таблицах, к которым вы присоединяетесь.
Используя описание вместо desc для таблицы2,
update
table1
set
value = (select code from table2 where description = table1.value)
where
exists (select 1 from table2 where description = table1.value)
and
table1.updatetype = 'blah'
;
Этот следующий синтаксис работает для меня.
UPDATE
(SELECT A.utl_id,
b.utl1_id
FROM trb_pi_joint A
JOIN trb_tpr B
ON A.tp_id=B.tp_id Where A.pij_type=2 and a.utl_id is null
)
SET utl_id=utl1_id;
SET
выполнял REPLACE
, и я пытался удалить определенную строку в столбце - получается, что Oracle рассматривает ''
как null, и это поле не может быть отменено. Я думал, что синтаксис просто обновлял таблицу temp вместо реального, но я был неправ.
– vapcguy
22 July 2016 в 21:03
UPDATE ( SELECT t1.value, t2.CODE
FROM table1 t1
INNER JOIN table2 t2 ON t1.Value = t2.DESC
WHERE t1.UPDATETYPE='blah')
SET t1.Value= t2.CODE
UPDATE (SELECT T.FIELD A, S.FIELD B
FROM TABLE_T T INNER JOIN TABLE_S S
ON T.ID = S.ID)
SET B = A;
A и B являются псевдонимами, вам не нужно указывать таблицу.
Объединить с предложением where для меня:
merge into table1
using table2
on (table1.id = table2.id)
when matched then update set table1.startdate = table2.start_date
where table1.startdate > table2.start_date;
Вам нужно предложение WHERE
, потому что столбцы, на которые ссылается в предложении ON
, не могут быть обновлены.
Oracle
не поддерживает объединения в операторах UPDATE
.
Используйте это:
MERGE
INTO table1 trg
USING (
SELECT t1.rowid AS rid, t2.code
FROM table1 t1
JOIN table2 t2
ON table1.value = table2.DESC
WHERE table1.UPDATETYPE='blah'
) src
ON (trg.rowid = src.rid)
WHEN MATCHED THEN UPDATE
SET trg.value = code;
ON rowid = rid
должно быть ON (rowid = rid)
. Я получил ошибку ORACLE ORA-00969: missing ON keyword
, пока не добавил скобки.
– Sonny
5 August 2012 в 21:43
merge into table 1 t
и т. Д.
– Michael-O
6 May 2013 в 13:12
ON
, trg
является псевдонимом для главной таблицы, table1
(«внешняя» таблица по вашей логике), а src
ссылается на группу USING
(«внутренняя таблица» на ваша логика). Но да, возможно, можно было бы назвать лучше, но я смог следить за ним.
– vapcguy
22 July 2016 в 20:32
UPDATE IP_ADMISSION_REQUEST ip1
SET IP1.WRIST_BAND_PRINT_STATUS=0
WHERE IP1.IP_ADM_REQ_ID =
(SELECT IP.IP_ADM_REQ_ID
FROM IP_ADMISSION_REQUEST ip
INNER JOIN VISIT v
ON ip.ip_visit_id=v.visit_id
AND v.pat_id =3702
); `enter code here`
Он отлично работает оракул
merge into table1 t1
using (select * from table2) t2
on (t1.empid = t2.empid)
when matched then update set t1.salary = t2.salary
t1.First_Name = t2.FirstName, t1.Last_Name = t2.LastName
на столе после сопоставления его с именем «UserName», column (t1.UserName = t2.UserName
), чтобы получить их имя из таблицы UserInfo (select * from UserInfo) t2
). База данных была такой, где она использовала UserName в качестве первичного ключа для UserInfo во всем мире, вместо того, чтобы напрямую помещать FirstName и LastName в таблицу. Это фиксировало это!
– vapcguy
20 July 2016 в 21:56