2016-11-24 136 views
0

我有了这个表耐心,必须查询它MySQL的使用子查询与更新

Update the database in order to provide a 3% discount to all patients in a room that has more than 2 patients.

表是由如下:

CREATE TABLE patient (
    sin varchar(20) NOT NULL, 
    disease varchar (20), 
    bed varchar (20), 
    room varchar (20), 
    hospital varchar (0), 
    fee varchar(20), 
    entry_date date NOT NULL, 
    exit_date date, 
    CONSTRAINT FOREIGN KEY (sin) REFERENCES person(sin) 
) 

所以我想找到所有患者'房间出现超过2名患者,然后更新表格:

UPDATE patient C 
INNER JOIN patient D ON C.sin=D.sin and D.sin IN (SELECT A.sin 
          FROM patient A 
          WHERE 2 < (SELECT COUNT(B.sin) 
             FROM patient B 
             WHERE A.hospital=B.hospital and A.room=B.room and A.exit_date IS NULL and B.exit_date IS NULL) 
    ) 
SET C.fee=C.fee*0.97 

问题是我得到的错误:

You can't specify target table 'C' for update in FROM clause

有没有办法使用子查询更新? 非常感谢。

回答

1

您现在处于正确的轨道上。 但是你想加入房间信息,而不是患者信息。所以:

UPDATE patient p JOIN 
     (select hospital, room 
     from patient 
     where exit_date is null 
     group by hospital, room 
     having count(*) > 2 
     ) r 
     ON p.hospital = r.hospital and p.room = r.room 
    SET p.fee = p.fee * (1 - 0.03) 
    WHERE exit_date is null; 
+0

工作完美,只是组'医院,房间'而不是团体医院,房间。如果你可以修改你的答案,所以它是完美的 非常感谢! – icosac

0

即使@Gordon Linoff给出了正确的答案,也可能是最好的,我只是提出这个问题后,有了一个主意。从我需要有至少3人在同一个房间的那一刻,我会检查,如果是这样的话,然后更新逐一:

UPDATE patient A, patient B, patient C 
SET A.fee=A.fee*0.97 
WHERE A.sin <> B.sin and A.sin <> C.sin and B.sin <> C.sin 
    and A.room=B.room and A.room=C.room 
    and A.hospital=B.hospital and A.hospital=C.hospital 
    and A.exit_date IS NULL and B.exit_date IS NULL and C.exit_date IS NULL 

象曰:这个答案是一个解决方法我的问题