Sql 与其他表比较时,根据字段删除记录

Sql 与其他表比较时,根据字段删除记录,sql,sas,proc-sql,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

我有非常基本的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
我需要做的是删除每个id的
date
小于
begin
字段或
date
大于
end
的行。这意味着对于
id
101,任何记录都不应具有1996年之前或2009年之后的日期

因此,我的预期结果是:

id    date     price    qtt
100   1999     12       200
101   1997     13       100
效率是一个问题,因为我正在为一个有数百万条记录的表执行此操作。我准备了一把小提琴来摆弄这些桌子,这样对你来说就容易多了


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

以下是您要执行的标准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
的所有行都将被删除

如果您在
表1(id,date)
上有一个索引,那么在大多数数据库中这应该是非常有效的

DELETE FROM A
FROM TABLE2 A
inner join table1 B
on A.id=B.id
and (A.[DATE] BETWEEN B.[BEGIN] AND B.[End])

你在用什么数据库?坦白说,我不知道。我通过SSH访问学术数据库,然后远程执行SAS脚本,通过它我使用SQL。因此,我通过SQL访问SAS文件。我不知道如何回答你的问题,我不知道在这个问题上它是否仍然适用。“数据库”将是“proc sql”或“sas”。谢谢你的快速回答。你能用SQLFiddle做这件事吗?我想测试它,因为我的“工作环境”不是最友好的(SAS中的SQL、远程执行SAS、打印表、检查结果)。我将您的解决方案应用到我的数据库中,它工作了!非常感谢你。现在我需要添加一个
price
x
quantity
列(这很容易),然后将该列除以具有相同
日期的记录的该列总和。这并不是那么容易。我正在调查总数,但仍然没有定论…@Bohemian。我认为在日期之间使用
是危险的,原因有几个。对于“真实”日期,时间值可以使用“介于之间”执行意外操作。在口语中,许多人认为“中间”不包括终点。而且,OP似乎已经把“日期”和“年”以及使用保留字作为标识符混淆了。很抱歉保留字,创建示例时是我的错。事实上,在基本示例中,它是开始和结束,而不是开始和结束。日期也不是年,我只是简化了它。但是你的解决方案是有效的,尽管我不明白为什么是表2“开始”而不是表1“开始”?它在输出中给了我错误,所以我更改了它,它工作了。另外,你能帮我在数据中添加我需要的列吗?我用
price
times
qtt
构建了一个列,但现在我需要对
date
上的时间进行求和。我已尝试将SUM(
变量
)除以(按
日期划分
)但它不起作用。还在试着打招呼。很抱歉,我还没有尝试您的解决方案,但谢谢您的帮助。