单个查询的SQL更新

时间:2014-04-07 08:56:08

标签: mysql

这个问题是我朋友问的。他在接受采访时遇到了这个问题。请忘记db structure :),我认为他们要求这个问题检查逻辑:)

以下是该方案。每个房间都有一个不同楼层和不同房间号的酒店。

最初表格会是这样的;

Floor Rooms
1
1
1
2
2

Rooms列将具有空值

我们需要使用单个查询填写如下所示的内容。这可能吗?如果是这样,我们如何做到这一点。请指教。

Floor    Rooms
1        101
1        102  
1        103
2        201
2        202

4 个答案:

答案 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

DEMO OF MYSQL

答案 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

这里演示:http://sqlfiddle.com/#!2/54c0d/1

答案 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