我对SQL有非常基本的了解,但为了处理大量数据,我需要使用它。这是我的问题:
我有两张表,如下:
table1:
id begin end
100 1998 2013
101 1996 2009
table2:
id date price qtt
100 1996 10 200
100 1999 12 200
101 1997 13 100
101 2013 14 100
我需要做的是删除date
小于begin
字段或date
大于end
的每个ID的行。这意味着对于id
101,没有记录应该在1996年之前或2009年之后有日期。
所以我的预期结果是:
id date price qtt
100 1999 12 200
101 1997 13 100
效率是一个问题,因为我这样做是为了拥有数百万条记录的表。我准备了一个带有这些表的sqlfiddle,这样你就更容易了。
http://sqlfiddle.com/#!2/66f54f/1
如果这个问题太简单,我很抱歉,但在搜索了三个小时后,我自己无法解决。提前谢谢!
答案 0 :(得分:2)
以下是您要执行的操作的标准SQL语法:
delete from table2
where not exists (select 1
from table1
where table1.id = table2.id and
table2.date between table1."begin" and table1."end"
);
请注意,如果id
中存在table2
但table1
不存在id
,那么table1(id, date)
的所有行都将被删除。
如果您在{{1}}上有索引,那么在大多数数据库中这应该非常有效。
答案 1 :(得分:0)
试试这个......
DELETE FROM A
FROM TABLE2 A
inner join table1 B
on A.id=B.id
and (A.[DATE] BETWEEN B.[BEGIN] AND B.[End])