0

我有 3 个表: TABLEA (ID INT, name VARCHAR(2))

ID  Name 
01  A4
01  SH
01  9K
02  M1
02  L4
03  2G
03  99

表 B(名称 VARCHAR(2))

Name 
5G
U8
02
45
23
J7
99
9F
A4
H2....

TableC(ID INT, Name VARCHAR(2)) (使用 tableA 中的 ID 预填充)(与 A 的记录数相同)

ID  Name 
01  NULL
01  NULL
01  NULL
02  NULL
02  NULL
03  NULL
03  NULL

我想从 B.Name 填充 C.Name ,以便对于相同的 ID(比如 1),它应该具有与 A.Name 不同的值。因此,对于 ID = 1,C.Name 不能具有 (A4, SH, 9K),因为它们已经存在于 A.name 中。此外,A.name 可能存在也可能不存在于 B.name 中。

这里的问题是我在 tableB 中没有其他列。我需要更多列来加入我的表吗?谢谢你的帮助!

4

1 回答 1

2

update您可以在子句中使用效率相当低的嵌套查询结构来做到这一点。

在 SQL Server 语法中:

update tableC
    set Name = (select top 1 b.name
                from TableB b 
                where b.name not in (select name from TableA a where a.id = TableC.id)
                order by NEWID()
               )

TableA的最内层select从同一个 id 获取所有名称。该where子句选择不在此列表中的名称。order by () limit 1随机选择其中一个名称。

根据我对问题的理解,这是一个有效的代码示例:

declare @tableA table (id int, name varchar(2));
declare @tableB table (name varchar(2));
declare @tableC table (id int, name varchar(2))

insert into @tableA(id, name)
    select 01, 'A4' union all
    select 01, 'SH' union all
    select 01, '9K' union all
    select 02, 'M1' union all
    select 02, 'L4' union all
    select 03, '2G' union all
    select 03, '99';

insert into @tableB(name)
    select '5G' union all
    select 'U8' union all
    select '02' union all
    select '45' union all
    select '23' union all
    select 'J7' union all
    select '99' union all
    select '9F' union all
    select 'A4' union all
    select 'H2';


insert into @tableC(id)
    select 01 union all
    select 01 union all
    select 01 union all
    select 02 union all
    select 02 union all
    select 03 union all
    select 03;

/*    
select * from @tableA;
select * from @tableB;
select * from @tableC;
 */

update c
    set Name = (select top 1 b.name
                from @TableB b 
                where b.name not in (select name from @TableA a where a.id = c.id)
                order by NEWID()
               )
from @tableC c

select *
from @tableC
于 2013-05-10T20:58:09.637 回答