2012-05-10 51 views
1

我有一张表,它看起来像下面这样。需要帮助搞清楚逻辑来操纵本地表中的数据(SQL)

EMPLID EFFDT EFFSEQ  DEPTID JOBCODE FLAG1  FLAG2  FLAG3 
    X <date> <number> <text> <text> <number> <number> <number> 
    X       
    Y       
    Z <date1> <number1> <text1> <text1> <number1> <number1> <number1> 
    Z <date2> <number2> <text2> <text2> <number2> <number2> <number2> 
    Z       

我无法搞清楚的是,如何消除第二和最后一排,同时管理,以保持第三排什么(EMPLID=Y

在的话,我需要淘汰的记录有一个人口充足的员工,并保留唯一一个空的员工。这是我不得不面对的一个更大的问题的一部分。我希望我有时间讨论整个问题。

谢谢

+1

**什么**数据库系统,以及哪个版本? ** SQL **只是结构化查询语言(Structured Query Language) - 许多数据库系统使用的语言 - SQL是** NOT **数据库产品......类似这样的东西通常是供应商特定的 - 所以我们真的需要知道什么您正在使用的数据库系统.... –

+0

可能的重复的[SQL - 如何删除重复的行?](http://stackoverflow.com/questions/18932/sql-how-can-i-remove-duplicate-行) –

+0

我有一个访问本地表。我需要从逻辑上知道,我如何能够做到这一点,我问上面。 – user1387874

回答

-1

我假设你只是想删除您的查询的行,而不是从表本身:

select * 
from MyTable 
where EMPLID = 'Y' 
    or coalesce(EFFDT, '') <> '' 
+0

嗨RedFilter。我不明白。我的表有大约50k条记录,包含emlid的x,y和z等组合。我还不清楚什么是合并。我在网上看了一下,看起来不太清楚。 – user1387874

+0

为什么downvote? – RedFilter

+0

@user'COALESCE'返回第一个非NULL值,否则返回NULL。在这种情况下,我使用它将NULL转换为空字符串。如果您没有NULL值,则不需要。它可以用'或EFFDT <>'''替换 – RedFilter

0

你需要一个“删除DUPE”查询。这种类型的查询背后的想法是通过某个唯一键将行分组,然后按主键或日期时间字段排序,然后删除除第一个或最后一个之外的所有内容。如果您需要隔离有重复组,对SO添加HAVING条款(即having count(*) > 1

这里有一个:

T-SQL: Deleting all duplicate rows but keeping one

with cte as ( 
    select [foo], [bar],  
    row_number() over (partition by foo, bar order by baz) as [rn] from table) 
delete cte where [rn] > 1 

如果你没有使用SQL Server,我确定有一种方法可以在几乎所有其他DBMS中执行此操作。

这里是另外一个,就中越更通用:

How can I remove duplicate rows?

DELETE MyTable 
FROM MyTable 
LEFT OUTER JOIN ( 
    SELECT MIN(RowId) as RowId, Col1, Col2, Col3  
    FROM MyTable  
    GROUP BY Col1, Col2, Col3 
) as KeepRows ON MyTable.RowId = KeepRows.RowId 
WHERE KeepRows.RowId IS NULL 
0

根据您想为空或不是你可以使用列:

DELETE TABLENAME 
WHERE 
EMPLID IN (
SELECT DISTINCT EMPLID 
    FROM TABLENAME 
WHERE EFFDT IS NOT NULL [OR EFFSEQ IS NOT NULL [...]] 
) AND EFFDT IS NULL [AND EFFSEQ IS NULL [...]]