2012-03-05 22 views
0

TableAのid int, match char(15), multiple char(10)SQL Server 2008の:他のテーブルに基づいて、列を更新する

int match multiple 
1 100 
2 101 
3 102 
4 103 

TableBのmatch char(15), match2 char(10)

match match2 
100 ABC 
100 NBG 
101 NYF 
102 NHW 
102 UYQ 
103 WOT 

、私はTableBであればTableA.multiple = "YES"を移入したいです対応する一致の場合、複数の一致2が存在します。

予想される結果。

int match multiple 
1 100 YES 
2 101 NULL 
3 102 YES 
4 103 NULL 

ありがとうございます!

マイFAILEDしてみてください。

Update A 
SET multiple = 'YES' 
From tableA A 
Inner join tableB B ON A.match = B.match 
WHERE (Select count(distinct(B.match2)) from TableB) > 2 
+0

101,103が一致する権利がありますか? – Teja

答えて

4

ちょうどその明確にするための余分な-冗長バージョン、とスタート:

UPDATE TableA 
SET multiple = 'YES' 
WHERE match in (
    -- isolate the multiples 
    SELECT match from (
     -- count the matches 
     SELECT count(*) as c, match from TableB 
     GROUP BY match) x 
    WHERE c > 1 
) 

HAVING句を使用すると、これを変更することができます...

SELECT match from (
     SELECT count(*) as c, match from TableB 
     GROUP BY match) x 
    WHERE c > 1 
これに

...:だから

SELECT match from TableB 
    GROUP BY match 
    HAVING count(*) > 1 

は、今、私たちは持っている:

UPDATE TableA 
SET multiple = 'YES' 
WHERE match in (
    SELECT match from TableB 
    GROUP BY match 
    HAVING count(*) > 1 
) 

私はそれをより小型化することができると確信しているが、私は個人的に非自明を含むUPDATE文で混乱JOIN特に、真夜中に「データベースが機能していない」という呼びかけがありました。

Don't Make Me Thinkもコーディングに適用されます。

+0

select count(distinct(*))as c ....ここでc> 1 –

+0

このコードは機能します。感謝!! –

+0

'1'だったはずの' 2'を修正しました。ありがとうございます。 – egrunin

-3
UPDATE TableA a 
SET multiple='YES' 
FROM Tablea a,(SELECT match FROM Tableb GROUP BY match HAVING COUNT(*)>1)b 
WHERE a.match=b.match 
+0

テーブルAに同じ一致のレコードが複数(match2)ある場合はYESにする必要があります –

+0

数字は考慮されていないため、これは機能しません。 – JonH

+0

@BhupinderSinghこれをチェックしてください。 – Teja

0
UPDATE tableA 
SET multiple = 'YES' 
FROM TableA AS a 
JOIN (SELECT match FROM tableB GROUP BY match HAVING COUNT(*) > 1) AS b ON a.match = b.match 
+0

この考えは良いですが、多くの状況でパフォーマンスが低下します。 –

関連する問題