0

人が集合住宅の部屋の割り当てを制御できるように、コードを作成しています。彼らが望んでいるのは、特定の学期のすべてのテナントにランダムに部屋番号を割り当てられるようにすることです。私が直面している問題は、挿入が完了した後、ランダムな部屋番号を選択するサブクエリがすべてのテナントで同じであることです。

部屋と部屋の利用可能なスポットを含むテーブルがあります。selectステートメントをinsertステートメントの外で全体として実行すると、正常に機能し、テナントごとに毎回ランダムな部屋番号が返されますが、insertステートメントはそうではありません。理由はありますか?

これが挿入ステートメントのコードです。

   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
4

1 に答える 1

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

私はあなたのテーブルを持っていないので、テストできませんでした。

于 2012-08-01T13:02:17.210 に答える