SQL - 删除只有一列更改的行

时间:2018-04-27 10:09:00

标签: sql select

我在SQL中有一个大表,每当其中一个列发生更改时,effective_from date列应该更新。但是,由于某种原因,有许多行,其中effective_from日期更改,但没有其他值已更改。例如:

CODE    NAME    EFFECTIVE_FROM
CCWA    Oak     1999
CCWA    Willow  2001
CCWA    Willow  2004

如何删除effective_from date中的更改未提供任何信息的行。例如上表中的第三行。

这些表非常大,所以我更喜欢使用SELECT语句而不是DELETE或ALTER,这似乎很慢。

非常感谢任何帮助!

5 个答案:

答案 0 :(得分:1)

我相信你在寻找:

SELECT Code, Name, MAX(EFFECTIVE_FROM)
FROM myTable 
GROUP BY  Code, Name

答案 1 :(得分:0)

试试这个:

SELECT code, name, max(EFFECTIVE_FROM) 
FROM tablename
GROUP BY code, name                                      

答案 2 :(得分:0)

由于更晚的日期未添加任何信息,因此您需要选择最小日期值。

<svg>

答案 3 :(得分:0)

您想使用lag()。结果集没有重复:

select t.*
from (select t.*,
             lag(code) over (order by effective_from) as prev_code,
             lag(name) over (order by effective_from) as prev_name
      from t
     ) t
where (prev_code <> code or prev_code is null) and
      (prev_name <> name or prev_name is null);

这假定codename永远不会NULL。这很容易合并到逻辑中(但它使where子句有点复杂)。

答案 4 :(得分:0)

您的问题并未明确您想要实现的实际结果:如果您想永久删除表中的元素,则需要使用DELETE,如果您的目标只是过滤掉您描述的重复项,则可以使用一个SELECT(元素将保留在表中)。

你考虑使用DELETE的事实让我想到这个&#34;重复&#34; (日期除外)是不可取的。 在这种情况下,您还可以考虑在信息字段(除EFFECTIVE_FROM之外的所有字段)未更改时添加阻止插入的触发器,这样只有有趣的数据更改才会生成新行。

然后你可以执行一次性操作,删除所有不反映任何数据变化的重复元素(夜间操作,或者当系统负载较低或没有人使用它时,如果当你输入时,表格非常大。

这种解决方案会改变此表的性质,实际上您会在没有实际数据更改的情况下丢失更新的历史信息。只有在目标不需要这些信息时才考虑此解决方案。