Sql 与其他表比较时,根据字段删除记录
我有非常基本的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
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
xquantity
列(这很容易),然后将该列除以具有相同日期的记录的该列总和。这并不是那么容易。我正在调查总数,但仍然没有定论…@Bohemian。我认为在日期之间使用是危险的,原因有几个。对于“真实”日期,时间值可以使用“介于之间”执行意外操作。在口语中,许多人认为“中间”不包括终点。而且,OP似乎已经把“日期”和“年”以及使用保留字作为标识符混淆了。很抱歉保留字,创建示例时是我的错。事实上,在基本示例中,它是开始和结束,而不是开始和结束。日期也不是年,我只是简化了它。但是你的解决方案是有效的,尽管我不明白为什么是表2“开始”而不是表1“开始”?它在输出中给了我错误,所以我更改了它,它工作了。另外,你能帮我在数据中添加我需要的列吗?我用price
timesqtt
构建了一个列,但现在我需要对date
上的时间进行求和。我已尝试将SUM(变量
)除以(按日期划分
)但它不起作用。还在试着打招呼。很抱歉,我还没有尝试您的解决方案,但谢谢您的帮助。