MySql使用带有更新的子查询

时间:2016-11-24 20:06:20

标签: mysql sql

我有这个表耐心,必须查询

  

更新数据库,以便为超过2名患者的房间内的所有患者提供3%的折扣。

表格如下:

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

问题是我收到了错误:

  

您无法在FROM子句

中为更新指定目标表'C'

有没有办法将子查询与更新一起使用? 非常感谢你。

2 个答案:

答案 0 :(得分:1)

你走在正确的轨道上。 但是您希望加入 room 信息,而不是患者信息。所以:

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;

答案 1 :(得分: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

AS SAID:这个答案解决了我的问题