1

我有 a1、a2、a3 列的表 A 和 b1、b2 列的表 B。当前 a2 列(表 A)包含所有空值,我想通过 b2(表 B)中的随机值更新 a2 值。但是在更新 a2 时,我需要检查它与 a1 列形成的唯一性。意味着它应该是 (a1,a2) 应该是唯一的。实现这一目标的最佳方法是什么。我正在使用 sql 2008。但我需要确保它也可以使用 oracle。

我已经尝试以下选择随机它发生得很好。

update A set a2 = (SELECT TOP 1 b2 FROM B ORDER BY newid())
where a2 is null
[but also need to form unique (a1,a2)]

4

2 回答 2

1

注意:在澄清 tableb的行数少于 table后,我更改了此答案a

这可以通过MERGE.

首先,假设表a中的行具有以下a1值:1, 1, 1, 1, 2, 2, 2, 2, 7, 7, 10, 10, 10, 10, 12, 12, 13, 13, 13, 13, 15, 15.

接下来,假设表b具有具有以下b2值的行:102, 103, 104, 105, 106, 107, 108.

使用此查询,每个a1值都可以与b2值轮流配对:

SELECT * FROM
 (SELECT a1, ROW_NUMBER() OVER (PARTITION BY a1 ORDER BY NULL) AS RowA
    FROM a) TableA
INNER JOIN
 (SELECT b2, ROW_NUMBER() OVER (Order by b2) AS RowB
    FROM b) TableB
ON Tablea.RowA = TableB.RowB

 A1 ROWA  B2 ROWB
--- ---- --- ----
  1    1 102    1 <-- first a1=1 goes with b2=102
  1    2 103    2 <-- second a1=1 goes with b2=103
  1    3 104    3 <-- third a1=1 goes with b2=104
  1    4 105    4 <-- fourth a1=1 goes with b2=105
  2    1 102    1 <-- start again: first a1=2 goes with b2=102
  2    2 103    2 <-- and so on...
  2    3 104    3
  2    4 105    4
  7    1 102    1
  7    2 103    2
 10    1 102    1
 10    2 103    2
 10    3 104    3
 10    4 105    4
 12    1 102    1
 12    2 103    2
 13    1 102    1
 13    2 103    2
 13    3 104    3
 13    4 105    4
 15    1 102    1
 15    2 103    2

这对于合并来说是不够的,因为它不能a唯一地标识表行,但ROWID可以解决这个问题。这是完整的查询:

MERGE INTO a
USING (
  SELECT * FROM
   (SELECT
        a.ROWID as ID,
        a1,
        ROW_NUMBER() OVER (PARTITION BY a1 ORDER BY a2) AS RowA
      FROM a) TableA
  INNER JOIN
   (SELECT b2, ROW_NUMBER() OVER (Order by b2) AS RowB
      FROM b) TableB
  ON Tablea.RowA = TableB.RowB) AtoB
ON (a.ROWID = AtoB.ID)
WHEN MATCHED THEN UPDATE SET a.a2 = AtoB.b2

这是a更新后的表格:

SELECT a1, a2 FROM a ORDER BY a1, a2;

 A1   A2
--- ----
  1  102
  1  103
  1  104
  1  105
  2  102
  2  103
  2  104
  2  105
  7  102
  7  103
 10  102
 10  103
 10  104
 10  105
 12  102
 12  103
 13  102
 13  103
 13  104
 13  105
 15  102
 15  103
于 2013-04-12T17:52:21.703 回答
0

您可以像这样使用查询

    CREATE TABLE A(a1 INT ,a2 INT, a3 int)

    CREATE TABLE B(b1 INT ,b2 INT )

    INSERT A VALUES (2,NULL,1)
    INSERT A VALUES (3,NULL,1)
    INSERT A VALUES (4,NULL,1)
    INSERT A VALUES (5,NULL,1)
    INSERT A VALUES (2,NULL,1)

    INSERT B VALUES (2,7)
    INSERT B VALUES (12,7)
    INSERT B VALUES (2,7)
    INSERT B VALUES (2,7)
    INSERT B VALUES (2,17)
    INSERT B VALUES (2,70)

    INSERT B VALUES (22,1)

    SELECT * FROM A

    UPDATE A SET a2=(SELECT TOP 1 b2 FROM B WHERE NOT EXISTS
    (SELECT 1 FROM A T2 WHERE A.a1=T2.a1 AND A.a2=B.B2 )
    ORDER BY NEWID())

    SELECT * FROM A

    SELECT * FROM B

    DROP TABLE A

    DROP TABLE B

如果您提供创建和插入语句来快速诊断问题会更好。

于 2013-04-12T17:30:52.040 回答