与另一个表比较时,根据字段删除记录

时间:2014-03-18 20:45:35

标签: sql sas proc-sql

我对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

如果这个问题太简单,我很抱歉,但在搜索了三个小时后,我自己无法解决。提前谢谢!

2 个答案:

答案 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中存在table2table1不存在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])