2012-08-01 57 views
0

我正在构建一段代码,以便人员可以控制房间分配。他们想要的是能够随机将房间号码分配给特定大学学期的所有租户。我遇到的问题是,插入完成后,所有租户选择随机房间号的子查询都是相同的。从随机值子查询中选择t-sql插入

我有一个房间的房间和可用斑点表。当我在insert语句之外整体运行select语句时,它工作得很好,每次为每个租户返回随机房间号,但插入语句不会。任何想法为什么?

这里是插入语句的代码。

INSERT INTO Rooms_Semester (UserId, SemesterId, RoomId, LastUpdatedBy) 
     SELECT u.Id, @SemesterId, 
        (SELECT TOP 1 r.Id 
        FROM Rooms r 
        WHERE (SELECT COUNT(rs.RoomId) 
          FROM Rooms_Semester rs 
          WHERE rs.RoomId = r.Id) <= r.NumberOfRooms 
         AND r.RoomNumber IS NOT NULL 
        ORDER BY NEWID()) 
      , 1 
     FROM [User] u 
      JOIN [Order] o 
       ON o.User_Id = u.Id 
      JOIN OrderItem oi 
       ON oi.Order_Id = o.Id 
      AND oi.Product_Id = @SemesterId 
      LEFT JOIN Rooms_Semester rs 
       ON rs.UserId = u.Id 
     WHERE oi.Product_Id = @SemesterId 
       AND LOWER(oi.Status) = 'tenant' 
       AND rs.RoomId IS NULL 
+0

Sql Server的哪个版本是? – 2012-08-01 13:05:37

+0

这是版本2008 – user1568610 2012-08-01 13:53:27

+0

这个问题对你来说非常具体,所以我不太可能从其他用户那里得到任何奖励。如果解决方案适合您,请接受问题或告诉我为什么您没有 – 2012-08-04 17:40:30

回答

0

尝试是这样的:

INSERT INTO Rooms_Semester (UserId, SemesterId, RoomId, LastUpdatedBy) 
select a.id, a.SemesterId, b.id, 1 
from 
(
SELECT u.Id, @SemesterId SemesterId, row_number() over (order by newid()) rn 
FROM [User] u JOIN [Order] o ON o.User_Id = u.Id JOIN OrderItem oi ON 
oi.Order_Id = o.Id AND oi.Product_Id = @SemesterId 
LEFT JOIN Rooms_Semester rs ON rs.UserId = u.Id 
WHERE oi.Product_Id = @SemesterId AND LOWER(oi.Status) = 'tenant' AND rs.RoomId IS NULL 
) a 
left join 
(SELECT Id, row_number() over (order by id) rn FROM Rooms where RoomNumber IS NOT NULL) b 
on b.rn = a.rn 

因为我没有你的表,我一直无法对其进行测试。