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                         

私が理解できないのは、3行目を維持しながら2行目と最後の行を削除する方法です( EMPLID=Y)

つまり、満員の従業員のレコードを削除し、唯一の空の従業員のレコードを保持する必要があります。これは、私が直面しているより大きな問題の一部です。問題全体について話し合う時間があればいいのにと思います。

ありがとうございました

4

3 に答える 3

0

'DELETEDUPE'クエリが必要です。このタイプのクエリの背後にある考え方は、行を一意のキーでグループ化し、主キーまたは日時フィールドのいずれかで並べ替えてから、最初のキーまたは最後のキーを除くすべてを削除することです。重複するグループを分離する必要がある場合は、HAVING句を追加します(つまりhaving count(*) > 1

これがSOに関するものです:

T-SQL:重複するすべての行を削除しますが、1つは保持します

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でより一般的なもう1つは次のとおりです。

重複する行を削除するにはどうすればよいですか?

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 に答える
0

null であると思われる列に応じて、次を使用できます。

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 に答える
-1

テーブル自体からではなく、クエリ内の行のみを削除したいと考えています。

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