SQL Anywhere: получение ошибки при попытке удалить результаты подзапроса с помощью соединения

Я создал следующий скрипт для поиска строк, глубина которых +-2 фута от другой строки:

select a.*
from   WELL_FORMATION a,
       WELL_FORMATION b
where  a.UWI=b.UWI
and    a.FORM_ID=b.FORM_ID
and    a.SOURCE != 'ABCD'
and    b.SOURCE  = 'ABCD'
and    abs(a.GX_FORM_TOP_DEPTH - b.GX_FORM_TOP_DEPTH) <= 2

Этот скрипт возвращает именно то, что мне нужно. Теперь мне нужно удалить результаты этого запроса.

Используя информацию, найденную здесь, я пришел к следующему:

DELETE t1
from well_formation t1
inner join
(
    select a.*
    from   WELL_FORMATION a,
           WELL_FORMATION b
    where  a.UWI=b.UWI
    and    a.FORM_ID=b.FORM_ID
    and    a.SOURCE != 'ABCD'
    and    b.SOURCE  = 'ABCD'
    and    abs(a.GX_FORM_TOP_DEPTH - b.GX_FORM_TOP_DEPTH) <= 2
) t2 on t1.uwi=t2.uwi
     and t1.form_id=t2.form_id
     and t1.source=t2.source

Однако я получаю сообщение об ошибке, в котором говорится, что Sybase не может найти таблицу с именем t1. Когда я удаляю "t1" после DELETE, я получаю сообщение об ошибке внутреннего соединения.

Я знаю, что получаю правильные результаты, потому что если я заменю «DELETE t1» на «SELECT *», я получу записи, которые хочу удалить.

Я использую SQL Anywhere. Есть ли у кого-нибудь предложения о том, что еще я мог бы попробовать?

Спасибо!


person Heather    schedule 20.11.2018    source источник


Ответы (2)


При удалении вам необходимо использовать псевдоним для ваших таблиц с помощью «AS t1».

Поэтому замените эту строку:

из well_formation t1

с этим:

из well_formation AS t1

person Rob Simmermon    schedule 20.11.2018

По-видимому, из всех, с кем я говорил, это особая особенность SQL Anywhere. Утверждение в том виде, в котором я его использовал, отлично работает в Oracle и даже с Transact SQL, но оно не является частью стандарта SQL в SQL Anywhere.

Тем не менее, кто-то, наконец, смог найти что-то, что будет работать. Это требует использования 2 предложений FROM.

Вот окончательный сценарий:

delete 
from well_formation as t1
from well_formation as t2
where  t1.UWI=t2.UWI
and    t1.FORM_ID=t2.FORM_ID
and    t1.SOURCE != 'ABCD'
and    t2.SOURCE  = 'ABCD'
and    abs(t1.GX_FORM_TOP_DEPTH - t2.GX_FORM_TOP_DEPTH) <= 2;

Надеюсь, это поможет любому, кто сталкивается с этой проблемой.

person Heather    schedule 26.11.2018