SQL 任何地方:尝试使用连接删除子查询的结果时出错

SQL Anywhere: getting error when trying to delete results of a subquery using a join

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

这个脚本returns正是我所需要的。现在我需要从这个查询中删除结果。

根据找到的信息 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 的 table。当我从 DELETE 之后删除 "t1" 时,我在内部连接上收到错误。

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

我正在使用 SQL Anywhere。有人对我还可以尝试什么有什么建议吗?

谢谢!

进行删除时,您需要使用 "AS t1"

为您的表设置别名

所以替换这一行:

从 well_formation t1

有了这个:

从 well_formation AS t1

显然,从与我交谈过的每个人看来,这是 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;

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