0

次の情報を持つ hr_Folders という名前のテーブルがあります。

FolderId    FolderName  EmployeeId  NumberOfEntries IsDeleted   
1            Folder 1      9                 1              0   
2            Folder 2      9                 1              0   
3            Folder 3      9                 1              0   

また、別のテーブル hr_EmployeeSavedRegistrants があり、フォルダー ID が | として保存されます。次のように区切られたリスト:

ID  EmployeeID  RegistrantID    FolderID    
44    9           4           1|2   
45    9           5           1|3       
46    9           6           2

folderidとemployeeidを渡すと、そのフォルダーがhr_folderから削除され、それに応じてhr_EmployeeSavedRegistrantsテーブルのFolderId列が更新されるストアドプロシージャを作成したい(folderid列リストからfolderidを削除し、hr_EmployeeSavedRegistrantsに1つのfolderidがある場合は、それを削除します) hr_EmployeeSavedRegistrants の行 3 のような行)

これまでに書かれたコードは次のとおりです。

CREATE PROC GetResumeCountInfolder

@Folder int

AS

DECLARE @FolderIDs VARCHAR(100)
SELECT @FolderIDs = FolderID from hr_EmployeeSavedRegistrants
where deleted = 0
and EmployeeID= 9

それを行う方法を提案してください

ありがとう

4

1 に答える 1

0

これがテーブル構造を考慮した解決策ですが、マフムードに同意します-テーブルを正規化する必要があります。2 つのフィールドとして EmployeeId と FolderId を使用して、hr_EmployeeFolders という名前の新しいテーブルを作成します。次に、1-n 個の従業員とフォルダーを格納できます。この方法で維持する方がはるかに簡単です。

ただし、現在のシナリオを考えると、次のようなものが機能するはずです。

create proc updatefolder 
  @FolderId int, @EmployeeId int
as
begin
  update hr_Folders 
  set isdeleted = 1
  where folderId = @folderId and employeeId = @employeeId

  update hr_EmployeeSavedRegistrants 
  set FolderId = replace(replace(folderId, @FolderId, ''),'||','|')
  where employeeId = @employeeId

  update hr_EmployeeSavedRegistrants 
  set FolderId =
    case 
      when left(FolderId,1) = '|' then right(folderId, len(folderId) - 1)
      when right(FolderId,1) = '|' then left(folderId, len(folderId) - 1)
      else FolderId
    end
  where employeeId = @employeeId
end

SQL フィドルのデモ

リストを分割して再作成するオプションは他にもいくつかありますが、これは私が考えることができる最も速い方法です。最初の update ステートメントは、folders テーブルの削除された列を更新します。2 番目の update ステートメントは、二重パイプの潜在的なインスタンスと共に、EmployeeSavedRegistrants テーブルからフォルダー ID を削除します。最後の update ステートメントは、先頭または末尾のパイプをすべて削除します。

于 2013-05-01T13:22:49.337 に答える