【问题标题】:t-sql insert from select with random value subqueryt-sql 从带有随机值子查询的选择中插入
【发布时间】:2012-07-30 08:49:44
【问题描述】:

我正在构建一段代码,以便人们可以控制公寓大楼的房间分配。他们想要的是能够为特定大学学期的所有租户随机分配房间号。我遇到的问题是,在插入完成后,我选择随机房间号的子查询对于所有租户都是相同的。

我有一张桌子,上面有房间和房间里的可用位置。当我在插入语句之外作为一个整体运行选择语句时,它工作得很好,每次为每个租户返回随机房间号,但插入语句没有。任何想法为什么?

这是插入语句的代码。

   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

【问题讨论】:

  • 那是哪个版本的 Sql Server?
  • 这个问题只针对您,所以我不太可能从其他用户那里获得任何积分。如果解决方案适合您,请接受问题或告诉我您为什么不这样做

标签: sql-server-2008 tsql select random insert


【解决方案1】:

试试这样的:

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

由于我没有你的表,我无法测试它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    相关资源
    最近更新 更多