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;
希望这对遇到此问题的其他人有所帮助。
我创建了以下脚本来查找距离另一行深度为 +-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;
希望这对遇到此问题的其他人有所帮助。