2008-08-20 19 views
3

私は、自分が誰に割り当てられているか、どのステージにいるのかなどのデータを含むビューを持っています。各ステージで各人が持つジョブの数を返すストアドプロシージャを作成する必要があります。Upsert Into Tableを実行するにはどうすればよいですか?

これまでのところ、私はこの(簡体字)があります。

DECLARE @ResultTable table 
(
    StaffName nvarchar(100), 
    Stage1Count int, 
    Stage2Count int 
) 

INSERT INTO @ResultTable (StaffName, Stage1Count) 
    SELECT StaffName, COUNT(*) FROM ViewJob 
    WHERE InStage1 = 1 
    GROUP BY StaffName 

INSERT INTO @ResultTable (StaffName, Stage2Count) 
    SELECT StaffName, COUNT(*) FROM ViewJob 
    WHERE InStage2 = 1 
    GROUP BY StaffName 

をそれに伴う問題は、行が結合していないということです。したがって、スタッフメンバーがstage1とstage2にジョブを持っている場合は、@ResultTableに2つの行があります。私が本当にしたいのは、スタッフが存在する場合は行を更新し、存在しない場合は新しい行を挿入することです。

これを行う方法を知っている人はいますか、別の方法を提案できますか? 私は本当にユーザーのリストを反復するためにカーソルを使用しないようにしたいと思います。

私はSQL Serverを使用しています2005年

編集:@Lee:残念ながらInStage1 = 1は、簡素化しました。実際には、DateStartedはNULLではなく、DateFinishedはNULLです。

編集:@BCS:私はすべてのスタッフの挿入を最初からやっているので、毎回更新する必要があります。しかし、私はこれらのUPDATEステートメントを正しいものにするのに苦労しています。

答えて

1

IIRC「重複オン」のいくつかの並べ替え(名前が間違っているかもしれない)行は(MySQLの)存在する場合は、更新することができます構文

は、何らかの形の代わりにあります:

INSERT INTO @ResultTable (StaffName, Stage1Count, Stage2Count) 
    SELECT StaffName,0,0 FROM ViewJob 
    GROUP BY StaffName 

UPDATE @ResultTable Stage1Count= (
    SELECT COUNT(*) AS count FROM ViewJob 
    WHERE InStage1 = 1 
    @ResultTable.StaffName = StaffName) 

UPDATE @ResultTable Stage2Count= (
    SELECT COUNT(*) AS count FROM ViewJob 
    WHERE InStage2 = 1 
    @ResultTable.StaffName = StaffName) 
+1

「重複している」とは、INSERTです...DUPLICATE KEY UPDATEについては、次のドキュメントを参照してください。http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html – nickf

1

実際の "upsert"タイプのクエリを取得するには、if exists ...型のものを使用する必要があります。残念なことに、これはカーソルを使用することを意味します。

しかし、2つのクエリを実行できます.1つは既存の行が存在する場所で更新を行い、その後は新しいクエリを挿入します。私はこのセットベースのアプローチは、排他的に少数の行を扱っていない限り好ましいと思います。

2

存在を確認して、適切なコマンドを使用するだけです。私はこれは本当に舞台裏でカーソルを使用しないと信じて、それはあなたがおそらく買ってあげるのが最善です:

IF (EXISTS (SELECT * FROM MyTable WHERE StaffName = @StaffName)) 
begin 
    UPDATE MyTable SET ... WHERE StaffName = @StaffName 
end 
else 
begin 
    INSERT MyTable ... 
end 

SQL2008がクールで新しいMERGE機能を持っていますが、それは実際に2005年

3

ではありません、私はあなたがそれをはるかに難しくしていると思います。あなたがやろうとしていることに対してこのコードは機能しませんか?

SELECT StaffName, SUM(InStage1) AS 'JobsAtStage1', SUM(InStage2) AS 'JobsAtStage2' 
    FROM ViewJob 
GROUP BY StaffName 
0

次の結果表の問合せは、行を再度結合する必要があります。これは、InStage1とInStage2が決して両方とも '1'でないことを前提としています。

select distinct(rt1.StaffName), rt2.Stage1Count, rt3.Stage2Count 
from @ResultTable rt1 
left join @ResultTable rt2 on rt1.StaffName=rt2.StaffName and rt2.Stage1Count is not null 
left join @ResultTable rt3 on rt1.StaffName=rt2.StaffName and rt3.Stage2Count is not null 
0

私はそれをBCSの答えのバリエーションで動作させることができました。しかし、私はテーブル変数を使用することはできませんでしたので、私は一時テーブルを作る必要がありました。

CREATE TABLE #ResultTable 
(
    StaffName nvarchar(100), 
    Stage1Count int, 
    Stage2Count int 
) 

INSERT INTO #ResultTable (StaffName) 
    SELECT StaffName FROM ViewJob 
    GROUP BY StaffName 

UPDATE #ResultTable SET 
    Stage1Count= (
    SELECT COUNT(*) FROM ViewJob V 
    WHERE InStage1 = 1 AND 
     V.StaffName = @ResultTable.StaffName COLLATE Latin1_General_CI_AS 
    GROUP BY V.StaffName), 
    Stage2Count= (
    SELECT COUNT(*) FROM ViewJob V 
    WHERE InStage2 = 1 AND 
     V.StaffName = @ResultTable.StaffName COLLATE Latin1_General_CI_AS 
    GROUP BY V.StaffName) 

SELECT StaffName, Stage1Count, Stage2Count FROM #ResultTable 

DROP TABLE #ResultTable 
関連する問題