2014-03-18 58 views
0

我有一个非常基本的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 

我需要做的是消除了具有不同于begindate小于或大于enddate更大每个ID行。这意味着对于id 101,没有记录应该有日期在1996年之前也没有2009年后

所以我预期的结果是:

id date  price qtt 
100 1999  12  200 
101 1997  13  100 

效率是一个问题,因为我做这行的表几百万记录。我已经准备好这些表的sqlfiddle,以便它更容易。

http://sqlfiddle.com/#!2/66f54f/1

我道歉,如果这个问题太简单了,但搜索了三个小时后,我无法来解决它自己。先谢谢你!

+1

? –

+0

坦率地说,我并不知道。我通过SSH访问学术数据库,然后远程执行SAS脚本,通过它我使用SQL。所以,我通过SQL访问SAS文件。我不知道如何回答你的问题,我不知道在这个问题上它是​​否仍然适用。 – sasstudent

+0

“数据库”将是“proc-sql”或“sas”。 –

回答

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)上有索引,这在大多数数据库中应该是非常高效的。

+0

谢谢你的快速回答。你能用SQLFiddle做这个工作吗?我想测试它,因为我的“工作环境”不是最友好的(SAS中的SQL,远程执行的SAS,打印表格,检查结果)。 – sasstudent

+0

我将您的解决方案应用于我的数据库,它工作正常!非常感谢你。我现在需要添加一个'价格'×'数量'列(这很容易),然后将该列除以具有相同'日期'的记录的该列的总和。这并不容易。我正在调查,但它仍然没有定论...... – sasstudent

+0

为什么不使用'between'?代码少就好。 – Bohemian

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]) 
您正在使用什么数据库
+0

你好。对不起,我还没有尝试过你的解决方案,但感谢你的帮助。 – sasstudent

相关问题