SQL Server 2008: соответствующие записи PASS - PullRequest
0 голосов
/ 03 марта 2012

TableA (id int, batch char(15), mode char(10), match2 char(15), status char(15))

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', где mode = 'B' и

  1. Для того же соответствия, если соответствующий ему режим A (ID1,2,3), если мы говорим о ABC12, имеет другой Match2.

Так что ID 4 и 5 получат «PASS».

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 03 марта 2012

Попробуйте следующее:

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 голосов
/ 03 марта 2012

Вот альтернатива, с использованием таблицы Diaho

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'
    ;
...