这个问题是我朋友问的。他在接受采访时遇到了这个问题。请忘记db structure :),我认为他们要求这个问题检查逻辑:)
以下是该方案。每个房间都有一个不同楼层和不同房间号的酒店。
最初表格会是这样的;
Floor Rooms
1
1
1
2
2
Rooms列将具有空值
我们需要使用单个查询填写如下所示的内容。这可能吗?如果是这样,我们如何做到这一点。请指教。
Floor Rooms
1 101
1 102
1 103
2 201
2 202
答案 0 :(得分:1)
非常简单,SQL Server代码,
with cte as
(
select *
,ROW_NUMBER() over (partition by fno order by fno) as rowNo
from hotel
)
update cte set rNo = fno*100 + rowNo
<强> DEMO 强>
MySQL的代码,我只能选择,因为更新临时表应该使用,我是MYSQL的新手。
set @type = 1;
set @num = 0;
select fno,(fno*100) + row_number as newRommNo from
(
select *
,@num := if(@type = fno, @num + 1, 1) as row_number
,@type :=fno
from hotel
) as a
答案 1 :(得分:0)
试试这个
update tablename set `Rooms`=(Floor*100)+1
答案 2 :(得分:0)
这可能对你有所帮助
我们必须声明scalar
变量:
SELECT fno, CASE WHEN fno = 1 THEN fno * 100 +@rooms :=@rooms + 1
WHEN fno = 2 THEN fno * 100 +@room :=@room + 1 END FROM hotel,
(SELECT @rooms := 0) AS w1, (SELECT @room := 0) AS w2
答案 3 :(得分:0)
如果您正在寻找 true atomic 解决方案而不必在更新查询之外设置和重置会话变量,请使用此查询:
UPDATE floor_rooms
INNER JOIN (
SELECT DISTINCT floor, (@room := 0), (@floor := 0)
FROM floor_rooms
WHERE ISNULL(room)
) AS floors
ON floor_rooms.floor = floors.floor
SET floor_rooms.room =
IF(@floor = floor_rooms.floor, @room := (@room + 1), @room := 1)
+ (@floor := floor_rooms.floor) * 100;
DEMO @ SQL Fiddle