【问题标题】:Apply a series of values from one table to a series of rows in another将一个表中的一系列值应用于另一个表中的一系列行
【发布时间】:2014-11-25 13:39:43
【问题描述】:

假设我的表 @A 包含一系列行,其中有一列包含这些行的 NULL 值,并且我的表 @B 包含(可能更少或更多)行的值,我该如何将@B 的值应用于@A 的行以填充NULLs,而不更改@B? (我的意思是不使用游标;使用游标相当简单。)@A@B 都在内存中(表变量)并且只有少量行,所以我们不必担心关于大数据集。

例如,如果我有:

DECLARE @A TABLE
(
        x INT,
        y NVARCHAR(20)
)
INSERT INTO @A (y) VALUES ('aaa'), ('bbb'), ('ccc')

DECLARE @B TABLE
(
        x INT
)
INSERT INTO @B (X) values (1), (2)

现在我有@A:

xy ------------ ------------ 空aaa 空 bbb 空抄送

@B:

X ------------ 1 2

...我想根据@B 更新@A,所以它有:

xy ------------ ------------ 1个 2个BB 空抄送

...理想情况下按此顺序(例如,@B 中的最低值变为x@A 中最低y,然后是下一个,等等)。

我觉得有一个相当简单的方法可以做到这一点,但我没有到达那里......

【问题讨论】:

    标签: sql-server tsql sql-server-2012


    【解决方案1】:

    此查询将有助于获得预期结果。

    DECLARE @A TABLE
    (
            x INT,
            y VARCHAR(10)
    )
    INSERT INTO @A (y) SELECT ('aaa') UNION SELECT('bbb') UNION SELECT('ccc')
    
    DECLARE @B TABLE
    (
            x INT
    )
    INSERT INTO @B (X) SELECT (1) UNION SELECT (2)
    
    
    UPDATE A SET x = B.x FROm 
         (SELECT *, ROW_NUMBER() OVER (ORDER BY y) AS RoW1 FROM @A) AS A
         INNER JOIN 
         (SELECT *, ROW_NUMBER() OVER (ORDER BY x) AS RoW1 FROM @B) AS B 
         ON A.RoW1 = B.RoW1
    
    SELECT * FROm @A
    

    【讨论】:

    • @GerethD,你忘记了你的另一部分 = 在加入中,不过我为你修好了
    【解决方案2】:

    成功了

    DECLARE @A TABLE
    (
            x INT,
            y NVARCHAR(20)
    )
    INSERT INTO @A (y) VALUES ('aaa'), ('bbb'), ('ccc')
    
    DECLARE @B TABLE
    (
            x INT
    )
    INSERT INTO @B (X) values (1), (2)
    
    Select * into #X from @B
    DECLARE @Val1 INT
    WHILE 0 < (Select COUNT(*) from #X)
      BEGIN
      SET ROWCOUNT 1
      Select @Val1 = MIN(x) from #X
      UPDATE @A set x = @Val1 where y = (Select MIN(y) from @A where x is null)
      Delete #X where x = @Val1
      if 0 = (Select Count(*) from @A where x is null)
         break
    
      END
    SET ROWCOUNT 0
    Select * from @A
    

    它可能不优雅,但它有效

    【讨论】:

    • 谢谢。有创意。 :-) 抱歉,但我没想到在问题中说“不更改@B”;我现在补充一下。
    • 我已经改了,但我认为另一个答案更好
    • 不知道为什么有人会否决它。它回答了这个问题,我并没有说它是完美的代码。有些人只是喜欢投反对票
    • 这是对循环的不必要使用,虽然在 3 行表和 2 行表上的性能可以接受,但这根本不能很好地扩展。 SQL 是一种基于集合的语言,很少有任何涉及循环的解决方案是最有效的。
    • 投反对票是因为答案没有用,因为它助长了坏习惯,而不是给出了不正确的解决方案。仅仅因为它解决了问题并不意味着它有用,就像如果有人问你从比勒陀利亚到德班的路线,你通过开普敦发送他们,最终结果是一样的,他们最终到达了德班, 但是你已经把它们完全排除在外了,我认为这些指示没有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多