我有两个具有父/子关系的表。我想用来自 child 的数据更新 parent 。但是,假设有 2 个 child ,我希望能够根据 child 的其他列来选择哪个 child 用于更新。
这是我到目前为止所拥有的:
家长:@test
child :@exdat
预期结果,更新后父级的结果应仅包含大写字母。我想用来自 child 的一些数据更新父级,但如果存在多个数据,我宁愿选择 p1 超过 p2、p2 超过 p3 和 p3 超过 p4 的 child

DECLARE @test TABLE
(
  id  int,
  val char(1)
);
DECLARE @exdat TABLE
(
  id  int,
  dval char(1),
  dimp char(2)
);
INSERT INTO @test (id,val)
            SELECT 1,'a'
    UNION ALL   SELECT 2,'b'
    UNION ALL   SELECT 3,'c'
    UNION ALL   SELECT 4,'d'
    UNION ALL   SELECT 5,'e'
    UNION ALL   SELECT 6,'f'
    UNION ALL   SELECT 7,'g'
;
INSERT INTO @exdat (id,dval,dimp)
            SELECT 1,'A','p1'
    UNION ALL   SELECT 2,'B','p3'
    UNION ALL   SELECT 3,'C','p1'
    UNION ALL   SELECT 4,'D','p2'
    UNION ALL   SELECT 5,'E','p2'
    UNION ALL   SELECT 6,'F','p3'
    UNION ALL   SELECT 7,'w','p2'
    UNION ALL   SELECT 7,'g','p3'
    UNION ALL   SELECT 7,'G','p1'
    UNION ALL   SELECT 7,'z','p4'
;
UPDATE @test SET
    val = e.dval
FROM
    @test t
    INNER JOIN @exdat e ON t.id = e.id
;
SELECT * FROM @test;

Result:
1   A
2   B
3   C
4   D
5   E
6   F
7   w <-- problem illustrated here

这个“w”可以是任何值 w,g,G,z。所以我问我如何根据其他列确定子选择的优先级?

最佳答案

您想要做的而不是连接是子查询。像这样的东西:

UPDATE
   a
SET
   a.val = ISNULL((
      SELECT TOP 1 x.dval
      FROM @exdat x
      WHERE x.id = a.id
      ORDER BY x.magic_field -- <- here's how you specify precedence
   ), 'ReasonableDefault')
FROM
   @test a

关于sql - 带有 Join 的 TSQL Update 语句,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5519058/

10-11 22:59
查看更多