Поддерживается ли предложение EXISTS механизмом SQLIS DBISAM?
Странно, но кажется, что EXISTS
предложение не поддерживается DBISAM
движок sql, так как он всегда приводит к ошибке SQL. Ниже приведен пример использования EXISTS. Я что-то здесь упускаю?
update Table1 set HASXACTION = False
WHERE EXISTS (SELECT SERIALID
From Table2
LEFT JOIN Table1 ON (Table2 .AUXILACT = Table1 .CODE)
AND (Table2 .CHARTACT = Table1 .CHARTACT) )
3 ответа
Не берите в голову людей, я только что узнал, что DBISAM не поддерживает оператор EXISTS для указания предикатов sub-select в предложениях WHERE. Это задокументировано в файле справки DBISAM (скриншот прилагается).
Я полагаю, что вы действительно не хотите join
в подзапросе. Вы, вероятно, намереваетесь выполнить коррелированный подзапрос:
UPDATE Table1
SET HASXACTION = False
WHERE EXISTS (SELECT SERIALID
FROM Table2
WHERE Table2.AUXILACT = Table1.CODE AND Table2.CHARTACT = Table1.CHARTACT
);
Это также должно исправить вашу проблему, которая является ссылкой на Table1
как в update
пункт и подзапрос. (Это ограничение MySQL.)
РЕДАКТИРОВАТЬ:
Я не могу найти ссылку на EXISTS
(или даже подзапросы) для dbisam. Но вы можете делать обновления с помощью соединений, поэтому это должно быть эквивалентно:
UPDATE Table1
SET HASXACTION = False
FROM Table1 JOIN
Table2
ON Table2.AUXILACT = Table1.CODE AND Table2.CHARTACT = Table1.CHARTACT;
Как вы уже нашли, вы можете сделать это с IN. Однако есть ограничение, что IN может работать только с одним полем. Таким образом, вы можете обойти это путем объединения двух полей, чтобы сделать выражения, которые соответствуют критериям. Один для внутреннего и один для внешнего.
update Table1 set HASXACTION = False
WHERE Code+'.'+CHARTACT IN
(
SELECT AUXILACT+'.'+CHARTACT From Table2
)