2016-11-24 140 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 

象曰:這個答案是一個解決方法我的問題