2

列 (pk) emp_id と emp_name を持つ従業員テーブルを作成しました。従業員番号と従業員名のフィールドを持つログ テーブルがあります。

emp_id が一意の識別子であるログのレコードをテーブルに入力しようとしていますが、ログのデータには従業員番号が重複しており、従業員名が欠落している場合があります。

従業員番号だけを入力してから、見つかった名前を更新しようとしましたが、サブクエリが複数の値を返したというエラーが発生しています。サブクエリが =、!= などの後に続く場合、これは許可されません。

SET IDENTITY_INSERT tblEmployee ON    
    Insert into tblEmployee (emp_id)        
    Select  Distinct [Employee Number]        
    From       
    wrkLogs        
    SET IDENTITY_INSERT tblEmployee OFF   

    Update tblEmployee        
    Set emp_name = (Select [Employee Name] 
                    From wrkLogs
                    Where emp_id= [Employee Number] AND LEN ([Employee Name] ) >1 
                    )        
    WHERE EXISTS (Select [Template Name] 
                    From wrkLogs
                    Where emp_id= [Employee Number ]AND LEN ([Employee Name] ) > 1  ) ;

テーブルにすべての個別の従業員番号とそれらが見つかった従業員名を入力するより良い方法を教えてください。問題は、データに空の従業員名が付いた従業員番号が含まれている場合があることだと思いますが、それでもテーブルにそれらのレコードが必要です。

4

2 に答える 2

0

これにより、id が 1 回だけ表示されるソース テーブルから id|name の組み合わせが取得されます。

 select id, name from source
 where name is not null and name <> ''  -- use trim() too if appropriate
 group by id having count(name) = 1

ターゲットテーブルが空であると仮定すると、それらの行を挿入できます。

次に、挿入された行をソース テーブルから削除できます。

ソーステーブルに残っているのは、そこに複数回出現する ID と null の名前であり、最初にクリーンアップする必要があります。つまり、一意の (id,name) の組み合わせのセットに減らします。それを行う方法は、ソース テーブルのガベージの種類 (null、長さ 0 の文字列、先頭/末尾のスペース、スペルミスと修正、完全な重複など) によって異なります。

PS は、ソース テーブルを適切な列名に置き換えます。

于 2013-07-31T18:03:42.837 に答える