2013-07-31 199 views
1

我使用列(pk)emp_id和emp_name創建了一個僱員表。我有一個日誌表,其中包含「員工編號」和「員工姓名」字段。具有不同值的更新列

我想填充我的表與emp_id是唯一標識符的日誌中的記錄。但是,日誌中的數據包含重複的員工數字和有時丟失的員工名稱。

我試着只填寫Employee號碼,然後更新找到的名稱,但是出現錯誤子查詢返回的值超過1。這當子查詢遵循=,!=不允許等

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 ) ; 

誰能給我一個更好的方法來填充表的所有不同的員工人數和在那裏他們發現員工姓名。我認爲問題是這些數據有時候有員工編號伴隨着一個空白的員工姓名,但我仍然希望這些記錄在表格中。我對sql server很陌生,可能會過度考慮這一點。

+1

你說「新的MySQL的」,但已經標記爲SQL服務器。好主意來澄清你正在使用哪個數據庫。 – Tim

+0

對不起,我的意思是SQL服務器 – user2382789

回答

0

要了解不同員工的數量和可用的名稱,則可以使用ROW_NUMBER排名功能

SET IDENTITY_INSERT dbo.employee ON 
;WITH cte AS 
(  
    SELECT *, 
    ROW_NUMBER() OVER(PARTITION BY [Employee Number] ORDER BY [Employee Name] DESC) AS rn 
    FROM dbo.wrkLogs 
    WHERE LEN([Employee Name]) >= 1 
) 
    INSERT dbo.employee(emp_id, emp_name) 
    SELECT [Employee Number], [Employee Name] 
    FROM cte 
    WHERE rn = 1 
SET IDENTITY_INSERT dbo.employee OFF 
+0

這是我想要的一些調整,謝謝! – user2382789

+0

賓果!很高興幫助你 –

0

這將讓你的ID |從哪裏ID只出現一次源表名稱的組合:

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,並且名稱是空的,並且必須先清除它們,也就是簡化爲一組唯一的(id,name)組合。如何做到這一點將取決於源表中的垃圾種類(例如,空值,零長度字符串,前導/尾隨空格,拼寫錯誤和更正,精確重複等)。

P.S.用適當的列名替換源表。

+0

謝謝,但結果不是我想要的。我基本上需要所有不同的員工編號和員工姓名(如有)。有時候,這個號碼是沒有名字的複製品。最重要的部分是不同的ID – user2382789

+0

「有時候這個號碼是沒有名字的複製品」。這種方法處理這個問題 - 它在使用HAVING子句進行分組之前排除沒有名稱的行。如果有不同名稱的重複號碼,則不處理。這是一個查詢無法解決的問題,除非是任意的。 – Tim