1

我有一张看起来像下面的桌子。

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

换句话说,我需要消除员工的记录,其中有一个人满为患,并保留唯一一个空的员工记录。这是我不得不面对的一个更大问题的一部分。我希望我有时间讨论整个问题。

谢谢

4

3 回答 3

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 [...]]
于 2013-03-30T18:33:11.150 回答
0

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

这是关于SO的一个:

T-SQL:删除所有重复的行但保留一个

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 都有一种方法可以做到这一点。

这是另一个更通用的 SO:

如何删除重复的行?

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 
于 2012-05-10T18:40:15.340 回答
-1

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

select *
from MyTable
where EMPLID = 'Y'
    or coalesce(EFFDT, '') <> ''
于 2012-05-10T18:34:52.020 回答