2016-06-17 14 views
1
select emp_id, emp_dept, emp_name 
from employee 
where emp_id in (123, 234); 


emp_id emp_dept emp_name 
***************************** 
123  222   1234 
123  222   5678 
123  222   9101 
234  222   1011 
234  222   1112 
234  222   1213 

各emp_idには3つのレコードがあります。 私はクエリは3つのレコードのうち、1つのレコードのみが555に更新されます(それがどのレコードのdoesntの問題である可能)と他の2が666最初の値の列の更新と残りの値の更新

+0

は、あなたがこれを再フォーマットし、あなたがきたかを示すことができます試した? –

+0

どのデータベースですか? SQLサーバー? – Matt

+0

emp_nameまたはemp_ssn? – scaisEdge

答えて

0

MERGEを使用できます。

データ準備

create table em1(
emp_id number, emp_dept number, emp_name varchar2(10)); 

insert into em1 values(123,1,'we'); 
insert into em1 values(123,1,'asd'); 
insert into em1 values(123,1,'rfw'); 
insert into em1 values(345,2,'rtg'); 
insert into em1 values(345,2,'bfg'); 
insert into em1 values(345,2,'uyi'); 
commit; 

クエリ

MERGE INTO em1 e 
USING (
    SELECT emp_id, emp_dept, emp_name, 
    row_number() over (partition by emp_id order by 1) r 
    FROM em1 
    WHERE emp_id in (123,345) 
) f 
ON (f.emp_id = e.emp_id and f.emp_name = e.emp_name) 
WHEN MATCHED THEN 
    UPDATE SET e.emp_dept = case when f.r = 1 then 555 else 666 end; 

結果

emp_id emp_dept emp_name 
------------------------- 
123  555   we 
123  666   asd 
123  666   rfw 
345  555   rtg 
345  666   bfg 
345  666   uyi 
0

に更新されるようにEMP_DEPTはCTEを作成し更新します(共通テーブル式)emp_idによってROW_NUMBER窓関数partitionedを追加すること、次に以下のコードは、テストデータをテーブル変数を構築ショーにデータを選択cteを接合update文を書くと行番号

を決定するために、ケースステートメントを構築しますあなたは "前"を確認し、次にcteメソッドで修正し、データを選択して最終結果を表示します。

;WITH cte AS (
    SELECT 
     emp_id 
     ,ROW_NUMBER() OVER (PARTITION BY emp_id ORDER BY emp_SSN) AS RowNum 
    FROM 
     @Table 
) 

UPDATE t 
    SET emp_dept = CASE WHEN RowNum = 1 THEN 555 ELSE 666 END 
FROM 
    @Table t 
    INNER JOIN cte u 
    ON t.emp_id = u.emp_id