2012-03-02 18 views
0

TableAid int, batch char(15), mode char(10), match2 char(15), status char(15)SQL Server 2008の:PASS一致するレコード

ID Match MODE match2 STATUS 
1 ABC12 A  123 
2 ABC12 A  123 
3 ABC12 A  123 
4 ABC12 B  234 
5 ABC12 B  234 
6 BCD32 A  456 
7 BCD32 B  456 

もしそうなら、私は、 'PASS' モード= 'B' と同じ試合のために

  1. でステータスを移入する必要がありますその対応するモードA(ID1,2,3)についてABC12について言えば、それは異なるMatch2を持っています。

したがってID4と5は「合格」になります。

ありがとうございます。

+0

を使用して、代替ですBレコードはパスですか?これは、SQL Serverまたはmysqlまたは何か他のですか? –

答えて

1

は、以下のことを試してみてください。

CREATE TABLE TableA (id int, match char(15), mode char(10),match2 char(15), status char(15)) 


INSERT INTO TableA (ID, Match, MODE, match2) 
SELECT 1, 'ABC12', 'A',  123 UNION 
SELECT 2, 'ABC12', 'A',  123 UNION 
SELECT 3, 'ABC12', 'A',  123 UNION 
SELECT 4, 'ABC12', 'B',  234 UNION 
SELECT 5, 'ABC12', 'B',  234 UNION 
SELECT 6, 'BCD32', 'A',  456 UNION 
SELECT 7, 'BCD32', 'B',  456 UNION 
SELECT 8, 'ABC23', 'A',  NULL UNION 
SELECT 9, 'ABC23', 'B',  789 


UPDATE 
    t1 
SET 
    status = 'PASS' 
FROM 
    TableA AS t1 
JOIN 
    TableA AS t2 
ON 
    t1.id != t2.id 
AND t1.match = t2.match 
AND (t1.match2 != t2.match2 OR t2.match2 IS NULL) 
AND t2.mode = 'A' 
WHERE 
    t1.mode = 'B' 

SELECT * FROM TableA 
+0

mode = Aとmatch = abc12の場合、match2 = nullの場合はどうなりますか? ID 4と5を引き継ぐはずですが、ここではNULLを値と比較していません。編集してください。おかげで –

+0

私は別のケースを追加しました(ID 8と9を見てください) - それはあなたの意味ですか?上記のコードでは、「パス」として9もマークされます。 – diaho

+0

完了!どうもありがとうございました ! –

0

は、ここでBが「MATCH」のではなく、MATCH2属性に任意のレコードと一致した場合にすることを、その後、だから、diahoのTableAの

MERGE TableA 
    USING (SELECT match, mode, match2 from TableA 
      GROUP BY match, mode, match2) as matches 
ON Tablea.mode = 'B' and matches.mode = 'A' 
AND tableA.match = matches.match 
-- before edit AND tableA.match2 <> matches.match2 
AND tableA.match2 <> Coalesce(matches.match2, 'SomeValueThatCantOccurInMatch2') -- requested edit 
WHEN MATCHED THEN UPDATE 
    SET STATUS = 'PASS' 
    ; 
+0

mode = A、match = abc12の場合、match2 = nullの場合はどうなりますか? ID 4と5を引き継ぐはずですが、ここではNULLを値と比較していません。編集してください。ありがとう –

+0

@BhupinderSinghモード= AとNULLがあり、モード= BがNULLであると仮定します。なぜなら、NULL == NULLは真ではないので一致しないはずですか? Coalesceを使った折り返しは、NULLを扱うもう1つの方法です。次に、 "NULL"に "NULL"をマッチさせ、比較の両側をラップし、NULLを置き換えるために同じ値を持つ場合、またはマッチしないようにする場合は、値。 –