HWND hwnd = ::GetConsoleWindow();
while (!((::GetForegroundWindow() == hwnd) &&
((::GetKeyState(VK_SPACE) & 0x8000) != 0)))
::Sleep(0);
Предположим, это не лучший способ, но он решил мою проблему. Замените VK_SPACE любым другим значением, которое вам нравится. И это не портативно.
Хороший вопрос.
Чтобы смоделировать вашу ситуацию, я создал образцы таблиц:
SQL> create table t_debtor(id_debtor,header)
2 as
3 select 1, 'Header 1' from dual union all
4 select 2, null from dual union all
5 select 3, 'Header 3' from dual
6 /
Tabel is aangemaakt.
SQL> create table t_element (id_element,id_debtor,insurer)
2 as
3 select 1, 1, 'to be updated' from dual union all
4 select 2, 1, 'to be updated' from dual union all
5 select 3, 2, 'not to be updated' from dual union all
6 select 4, 2, 'not to be updated' from dual union all
7 select 5, 3, 'to be updated' from dual
8 /
Tabel is aangemaakt.
И с вашим текущим оператором обновления проблема становится ясной: значения «не обновлять» установлены в NULL:
SQL> update
2 T_ELEMENT elt
3 set elt.INSURER = (
4 select HEADER
5 from T_DEBTOR debtor
6 where
7 debtor.HEADER is not null
8 and debtor.ID_DEBTOR = elt.ID_DEBTOR)
9 /
5 rijen zijn bijgewerkt.
SQL> select * from t_element
2 /
ID_ELEMENT ID_DEBTOR INSURER
---------- ---------- -----------------
1 1 Header 1
2 1 Header 1
3 2
4 2
5 3 Header 3
5 rijen zijn geselecteerd.
Лучший способ выполнить это обновление - обновить соединение обеих таблиц. Однако есть некоторые ограничения:
SQL> rollback
2 /
Rollback is voltooid.
SQL> update ( select elt.insurer
2 , dtr.header
3 from t_element elt
4 , t_debtor dtr
5 where elt.id_debtor = dtr.id_debtor
6 and dtr.header is not null
7 )
8 set insurer = header
9 /
set insurer = header
*
FOUT in regel 8:
.ORA-01779: cannot modify a column which maps to a non key-preserved table
С помощью подсказки bypass ujvc мы можем обойти это ограничение. Но делать это не рекомендуется, если вы действительно не уверены, что t_debtor.id_debtor уникален.
SQL> update /*+ bypass_ujvc */
2 ( select elt.insurer
3 , dtr.header
4 from t_element elt
5 , t_debtor dtr
6 where elt.id_debtor = dtr.id_debtor
7 and dtr.header is not null
8 )
9 set insurer = header
10 /
3 rijen zijn bijgewerkt.
SQL> select * from t_element
2 /
ID_ELEMENT ID_DEBTOR INSURER
---------- ---------- -----------------
1 1 Header 1
2 1 Header 1
3 2 not to be updated
4 2 not to be updated
5 3 Header 3
5 rijen zijn geselecteerd.
Лучше просто добавить первичный ключ. У вас, вероятно, уже есть это:
SQL> rollback
2 /
Rollback is voltooid.
SQL> alter table t_debtor add primary key (id_debtor)
2 /
Tabel is gewijzigd.
SQL> update ( select elt.insurer
2 , dtr.header
3 from t_element elt
4 , t_debtor dtr
5 where elt.id_debtor = dtr.id_debtor
6 and dtr.header is not null
7 )
8 set insurer = header
9 /
3 rijen zijn bijgewerkt.
SQL> select * from t_element
2 /
ID_ELEMENT ID_DEBTOR INSURER
---------- ---------- -----------------
1 1 Header 1
2 1 Header 1
3 2 not to be updated
4 2 not to be updated
5 3 Header 3
5 rijen zijn geselecteerd.
С уважением, Роб.
Вы пробовали
update
T_ELEMENT elt
set elt.INSURER = (
select HEADER
from T_DEBTOR debtor
where
debtor.HEADER is not null
and debtor.ID_DEBITEUR = elt.ID_DEBITEUR)
where not elt.ID_DEBITEUR is null;
Вы можете сделать это, обновив результаты выбора, но таблицы должны быть «сохранены ключом»:
SQL> create table t_debtor ( id_debtor integer, header varchar2(10));
Table created.
SQL> create table t_element (id_element integer, id_debtor integer, insurer varchar2(10));
Table created.
SQL> insert into t_debtor values (1, 'something');
1 row created.
SQL> insert into t_debtor values (2, 'else');
1 row created.
SQL> insert into t_debtor values (3, null);
1 row created.
SQL>
SQL> insert into t_element values (1, 1, 'foo');
1 row created.
SQL> insert into t_element values (2, 2, null);
1 row created.
SQL> insert into t_element values (3, 3, 'bar');
1 row created.
SQL> commit;
Commit complete.
Это создает ваши таблицы (подсказка - это очень полезно, если вы можете публиковать SQL для вашего примера!)
Теперь вы можете обновить результаты выбора, чтобы получить то, что вы хотите ...
SQL> update (select e.id_element, d.header header, e.insurer insurer
from t_debtor d, t_element e
2 where d.id_debtor = e.id_debtor 3
4 and d.header is not null)
5 set insurer = header;
set insurer = header
*
ERROR at line 5:
ORA-01779: cannot modify a column which maps to a non key-preserved table
Это не удается, потому что таблица не сохраняет ключ, но несколько ограничений решат эту проблему:
alter table t_element add constraint t_element_pk primary key (id_element) using index;
alter table t_debtor add constraint t_debtor_pk primary key (id_debtor) using index;
alter table t_element add constraint t_element_debtor_fk foreign key (id_debtor) references t_debtor(id_debtor);
Теперь обновление будет работать, поскольку ключи таблиц сохранены:
SQL> update (select e.id_element, d.header header, e.insurer insurer
from t_debtor d, t_element e
where d.id_debtor = e.id_debtor
and d.header is not null)
set insurer = header 2 3 4 5 ;
2 rows updated.
SQL> select * from t_element;
ID_ELEMENT ID_DEBTOR INSURER
---------- ---------- ----------
1 1 something
2 2 else
3 3 bar
Вы пробовали
update
T_ELEMENT elt
set elt.INSURER = NVL((
select HEADER
from T_DEBTOR debtor
where
debtor.HEADER is not null
and debtor.ID_DEBTOR = elt.ID_DEBTOR), elt.INSURER);
или что-то подобное правда, это немного невыборно, но я думаю, что он сделает то, что вы намереваетесь.
Я нашел решение моей проблемы (добавлено предложение where):
update
T_ELEMENT elt
set elt.INSURER = (
select HEADER
from T_DEBTOR debtor
where
debtor.HEADER is not null
and debtor.ID_DEBTOR = elt.ID_DEBTOR)
where exists (
select null
from T_DEBTOR debtor
where debtor.HEADER is not null
and debtor.ID_DEBTOR = elt.ID_DEBTOR);
Если у вас есть лучшее решение, не стесняйтесь его размещать!
, начиная с Oracle 8i (я не пробовал с предыдущими версиями), вы можете обновить соединение, если таблицы «сохранены ключом» (например, если вы обновляете дочерний элемент из в родительско-дочерних отношениях). Здесь, если id_debtor является первичным ключом T_DEBTOR, вы можете:
UPDATE (SELECT e.insurer, d.header
FROM t_element e, t_debtor d
WHERE e.id_debtor = d.id_debtor
AND d.header IS NOT NULL)
SET insurer = HEADER;
Ура,
-
Винсент
Вы можете использовать оператор SQL Case, чтобы различать, когда HEADER имеет значение null и когда он имеет значение:
http://www.tizag.com/sqlTutorial/sqlcase.php