【问题标题】:SQL Server 2008 : PASS matching recordsSQL Server 2008:通过匹配记录
【发布时间】:2012-03-21 09:27:55
【问题描述】:

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”。

提前致谢。

【问题讨论】:

  • 因此,如果 B 匹配“MATCH”上的任何 A 记录,而不是 match2 属性上的任何 A 记录,那么该 B 记录是否为 PASS?这是sql server还是mysql还是别的什么?

标签: sql matching records


【解决方案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

【讨论】:

  • 如果 mode=A 和 match=abc12 的 match2= null 怎么办。它仍然应该通过 ID 4 和 5 但在这里它不会因为我们将 NULL 与 value 进行比较。请编辑。谢谢
  • 我添加了另一个案例(请参阅 ID 8 和 9) - 您是这个意思吗?上面的代码也会将 9 标记为 PASS
【解决方案2】:

这是一个替代方案,使用 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'
    ;

【讨论】:

  • 如果 mode=A 和 match=abc12 的 match2= null 怎么办。它仍然应该通过 ID 4 和 5 但在这里它不会因为我们将 NULL 与 value 进行比较。请编辑。谢谢
  • @BhupinderSingh 假设 mode=A 和 NULL 和 mode=B 和 NULL,它们不应该匹配,因为 NULL==NULL 不正确?用 Coalesce 包裹是另一种处理 NULL 的方法,那么如果您希望“NULL”匹配“NULL”,则将比较的两侧包裹并具有相同的值来替换 NULL,或者如果您希望它们不匹配,则有两个不同的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-15
  • 2014-04-22
  • 2012-06-19
  • 1970-01-01
相关资源
最近更新 更多