我在Oracle中有两个表A和B:
A (a1, a2)
B (b1, b2, b3, b4, b5)
有些行如:
A(type1, 192.168.94.1)
A(type1, 192.168.94.2)
A(type2, 192.168.94.1)
B(type1, 192, 168, 94, 1)
B(type1, 192, 168, 94, 3)
B(type2, 192, 168, 94, 2)
在表A中,我们有 A(type1,192.168.94.1)
在表B中,我们还有 B(type1,192,168,94,1)
在表A中,我想删除行
A(type1, 192.168.94.1)
因为它的类型类似于表B中的类型
A.a1 = B.b1
-> type1 = type1
并且在B
中连接时ip地址重复 A.a2 = B.b2 ||'.'|| B.b3 ||'.'|| B.b4 ||'.'|| B.5
-> 192.168.94.1 = 192.168.94.1
你可以给我一些建议吗?
答案 0 :(得分:3)
delete from A
where ROWID in
(select A.ROWID
from A,B
where A.A1 = B.B1
and A.A2 = concat(B.B2, B.B3, B.B4)
)
答案 1 :(得分:0)
您没有向我们提供有关您尝试做什么的更多信息,但我认为您希望删除A
中有B
链接的行,您可以尝试:< / p>
DELETE FROM a
WHERE EXISTS
(SELECT 1
FROM B
WHERE a.a1 = b.b1
AND a.a2 = CONCAT(b.b2, b.b3, b.b4));
假设:
1)表格A
和B
之间的链接在原始帖子中是正确的
2)您只想删除表A
希望它有所帮助...
修改强>
在你的新评论之后,这个问题仍然比较模糊。
我不知道您是只想删除表格A
中的IP列数据还是重复行。
如果您只想删除表A
中的重复行,那么很简单:
DELETE FROM A
WHERE rowid NOT IN
(SELECT MIN(rowid)
FROM A
GROUP BY a1, a2);
这假设列a1和a2是表A
的主键。
您是否也可以说明您认为需要链接到表格B
的原因?
答案 2 :(得分:0)
我怀疑您没有找到任何要删除的内容,因为您可能无法正确加入这两个表,因为您的concat会为您提供concat('192', '168', '94', '1') = '192168941'
,这与'192.168.94.1'
不同
delete from A a
where exists (
select 1
from B b
where a.a1 = b.b1
and a.a2 = b.b2 || '.' || b.b3 || '.' || b.b4 || '.' || b.b5)
编辑:
使用concat
来连接9个参数会导致too many parameters
异常,因此我正在使用||
运算符。
答案 3 :(得分:0)
我来自SQL Server世界,所以我尝试了这个:
delete
from E_CRM_ACTIVITYPOINTER ap
inner join tmp_activitypointer_for_delete d
on AP.ACTIVITYID = d.activityid
where ap.current_flag = 1
and d.start_date != AP.START_DATE
那在我的Oracle 11g环境中没有用,所以我修改了这个:
delete
from E_CRM_ACTIVITYPOINTER
where (ACTIVITYID,START_DATE) in
(
select AP.ACTIVITYID, AP.START_DATE
from E_CRM_ACTIVITYPOINTER ap
inner join tmp_activitypointer_for_delete d
on AP.ACTIVITYID = d.activityid
where ap.current_flag = 1
and d.start_date != AP.START_DATE
)
希望这会帮助别人。