table 中的随机数待更新
Random number from table to be updated
我有一个 table,其中包含 EmployeeID、EmployeeName、EmployeeDeptID。我正在尝试为此 table 输入一些示例数据。
我收到了带有 EmployeeID 和 EmployeeName 的文本文件,并将其加载到 Employee table.
我被告知 EmployeeDeptID 的值为 2010,2590,2877 和 null。我被要求将 EmployeeDeptID 随机分配给 Employees。我不知道该怎么做
这是我试过的。
Create Table dbo.Employee(EmployeeID INT,EmployeeName VARCHAR(100), EmployeeDeptID INT)
我用 'import data' 加载到 dbo.Employee。
我又创建了一个table
Create table temp.SampleEmployeeDeptID(EmployeeDeptID int)
insert into temp.SampleEmployeeDeptID(EmployeeDeptID)values(null)
insert into temp.SampleEmployeeDeptID(EmployeeDeptID)values(2010)
insert into temp.SampleEmployeeDeptID(EmployeeDeptID)values(2590)
insert into temp.SampleEmployeeDeptID(EmployeeDeptID)values(2877)
我知道我必须使用这个
SELECT TOP 1 * FROM temp.SampleEmployeeDeptID ORDER BY newid()
获取随机 EmployeeID 但不知道如何在 Update 语句中使用它。
感谢任何帮助。还有其他更简单的方法吗?
使用 ORDER BY Rand()
从 temp.SampleEmployeeDeptID 中提取一个随机的 EmployeeDeptID,然后使用游标遍历 dbo.Employee 的每一行以设置新值。
DECLARE @EmployeeID as INT;
DECLARE @EmployeeCursor as CURSOR;
SET @EmployeeCursor = CURSOR FOR
SELECT EmployeeID From dbo.Employee
OPEN @EmployeeCursor;
FETCH NEXT FROM @EmployeeCursor INTO @EmployeeID;
WHILE @@FETCH_STATUS = 0
BEGIN
SET Employee.EmployeeDeptID = (Select TOP 1 * from temp.SampleEmployeeDeptID Order By Rand()) Where EmployeeID = @EmployeeID
END
这是您可以尝试的一种可能的解决方案,我模拟了您的示例 table:
我生成了一个随机 ID 值列表和一个代理键,然后可以将其连接到现有 table,再次使用代理 ID,然后可以使用 CTE 对其进行更新:
/* Sample data*/
Create Table dbo.Employee(EmployeeID INT,EmployeeName VARCHAR(100), EmployeeDeptID INT);
insert into Employee select 1,'Person 1', null;
insert into Employee select 2,'Person 2', null;
insert into Employee select 3,'Person 3', null;
insert into Employee select 4,'Person 4', null;
with v as (
select v, Row_Number() over(order by NewId()) Id
from (values(2010),(2590),(2877),(null))x(v)
), e as (
select *, Row_Number() over (order by EmployeeId) Id
from Employee
), u as (
select e.EmployeeDeptID, v.v
from v join e on e.Id = v.Id
)
update u set employeeDeptId = v;
/* Test result */
select * from Employee;
查看工作Demo FIddle
我有一个 table,其中包含 EmployeeID、EmployeeName、EmployeeDeptID。我正在尝试为此 table 输入一些示例数据。 我收到了带有 EmployeeID 和 EmployeeName 的文本文件,并将其加载到 Employee table.
我被告知 EmployeeDeptID 的值为 2010,2590,2877 和 null。我被要求将 EmployeeDeptID 随机分配给 Employees。我不知道该怎么做
这是我试过的。
Create Table dbo.Employee(EmployeeID INT,EmployeeName VARCHAR(100), EmployeeDeptID INT)
我用 'import data' 加载到 dbo.Employee。
我又创建了一个table
Create table temp.SampleEmployeeDeptID(EmployeeDeptID int)
insert into temp.SampleEmployeeDeptID(EmployeeDeptID)values(null)
insert into temp.SampleEmployeeDeptID(EmployeeDeptID)values(2010)
insert into temp.SampleEmployeeDeptID(EmployeeDeptID)values(2590)
insert into temp.SampleEmployeeDeptID(EmployeeDeptID)values(2877)
我知道我必须使用这个
SELECT TOP 1 * FROM temp.SampleEmployeeDeptID ORDER BY newid()
获取随机 EmployeeID 但不知道如何在 Update 语句中使用它。
感谢任何帮助。还有其他更简单的方法吗?
使用 ORDER BY Rand()
从 temp.SampleEmployeeDeptID 中提取一个随机的 EmployeeDeptID,然后使用游标遍历 dbo.Employee 的每一行以设置新值。
DECLARE @EmployeeID as INT;
DECLARE @EmployeeCursor as CURSOR;
SET @EmployeeCursor = CURSOR FOR
SELECT EmployeeID From dbo.Employee
OPEN @EmployeeCursor;
FETCH NEXT FROM @EmployeeCursor INTO @EmployeeID;
WHILE @@FETCH_STATUS = 0
BEGIN
SET Employee.EmployeeDeptID = (Select TOP 1 * from temp.SampleEmployeeDeptID Order By Rand()) Where EmployeeID = @EmployeeID
END
这是您可以尝试的一种可能的解决方案,我模拟了您的示例 table:
我生成了一个随机 ID 值列表和一个代理键,然后可以将其连接到现有 table,再次使用代理 ID,然后可以使用 CTE 对其进行更新:
/* Sample data*/
Create Table dbo.Employee(EmployeeID INT,EmployeeName VARCHAR(100), EmployeeDeptID INT);
insert into Employee select 1,'Person 1', null;
insert into Employee select 2,'Person 2', null;
insert into Employee select 3,'Person 3', null;
insert into Employee select 4,'Person 4', null;
with v as (
select v, Row_Number() over(order by NewId()) Id
from (values(2010),(2590),(2877),(null))x(v)
), e as (
select *, Row_Number() over (order by EmployeeId) Id
from Employee
), u as (
select e.EmployeeDeptID, v.v
from v join e on e.Id = v.Id
)
update u set employeeDeptId = v;
/* Test result */
select * from Employee;
查看工作Demo FIddle