【问题标题】:Delete records depending on field when compared to another table与另一个表相比时,根据字段删除记录
【发布时间】:2014-03-18 20:45:34
【问题描述】:

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

效率是一个问题,因为我正在为具有数百万条记录的表执行此操作。我已经为这些表准备了一个 sqlfiddle,这样对你来说更容易。

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

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

【问题讨论】:

  • 你用的是什么数据库?
  • 坦率地说,我不知道。我通过 SSH 访问一个学术数据库,然后远程执行 SAS 脚本,通过它我使用 SQL。所以,我正在通过 SQL 访问 SAS 文件。我不知道如何回答你的问题,我不知道在这个问题中是否仍然适用。
  • “数据库”将是“proc-sql”或“sas”。

标签: sql sas proc-sql


【解决方案1】:

这是您想要执行的标准 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"
                     );

请注意,如果table2 中存在idtable1 中不存在,则该id 的所有行都将被删除。

如果您在table1(id, date) 上有索引,这在大多数数据库中应该非常有效。

【讨论】:

  • 感谢您的快速答复。你能在 SQLFiddle 中完成这项工作吗?我想测试它,因为我的“工作环境”不是最友好的(SAS 中的 SQL、远程执行 SAS、打印表格、检查结果)。
  • 我将您的解决方案应用到了我的数据库中,并且成功了!非常感谢你。我现在需要添加一个price x quantity 列(这很容易),然后将该列除以具有相同date 的记录的该列的总和。这并不容易。我正在调查总和,但仍然没有定论......
  • @Bohemian 。 . .我认为将between 与日期一起使用是危险的,原因有几个。使用“真实”日期,时间值可以用“介于”做意想不到的事情。在口语中,很多人认为“之间”不包括端点。而且,OP 似乎已经在“日期”和“年份”以及使用保留字作为标识符之间混淆了。
  • 对不起,保留字是我创建示例时的错。事实上,在基本示例中,它是开始和结束,而不是开始和结束。日期也不是年份,我只是简化了它。但是您的解决方案有效,尽管我不明白为什么 table2."begin" 而不是 table1."begin"?它在输出中给了我错误,所以我改变了它并且它工作了。
  • 另外,您能帮我处理我数据中需要的附加列吗?我用price 乘以qtt 构建了一个列,但现在我需要将它们与date 相加。我已经尝试过 SUM(variable) OVER (PARTITION BY date) 但它不起作用。还在尝试
【解决方案2】:

试试这个...

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

【讨论】:

  • 你好。抱歉,我还没有尝试过您的解决方案,但感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
相关资源
最近更新 更多