SQL Anywhere:尝试使用联接删除子查询的结果时出错

时间:2018-11-20 20:44:59

标签: sql sqlanywhere

我创建了以下脚本来查找深度距另一行+ -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

此脚本返回的正是我所需要的。现在,我需要从该查询中删除结果。

使用找到的信息here,我得出以下结论:

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的表。当我从DELETE之后删除“ t1”时,内部联接出现错误。

我知道我得到了正确的结果,因为如果我将“ DELETE t1”替换为“ SELECT *”,则会得到要删除的记录。

我正在使用SQL Anywhere。有人对我还能尝试的方法有任何建议吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

删除时,您需要使用“ AS t1”为表加上别名

因此替换此行:

来自well_formation t1

与此:

来自well_formation AS t1

答案 1 :(得分:0)

显然,与我交谈过的每个人中,这都是SQL Anywhere的一个特殊之处。我拥有的该语句在Oracle甚至在Transact SQL中都可以正常运行,但是它不是SQL Anywhere中SQL标准的一部分。

但是,终于有人能够找到可行的方法。它需要使用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;

希望这对遇到此问题的其他人有所帮助。