Поддерживается ли предложение 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 (скриншот прилагается).

Справочная документация 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
 )
Другие вопросы по тегам