5

「Bed」や「PatientRecord」などのテーブルがあります。患者に空のベッドを割り当てたい (つまり、ステータスが「利用可能」のベッド テーブルからの bID)、その bID ステータスを「占有」に変更します。これを手伝ってください。以下は私の現在のクエリですが、続行する方法がわかりません。

update Patient_Record 
set b_ID = (select top 1 b_ID from bed where Status_Avai_Occ = 'Available')
/*i want to change the status of this b_ID to "Occupied"*/
where Admission_Type = 'In Patient' 
4

6 に答える 6

3

これが難しいのは、デザインに欠陥があるためだと思いますが、それを修正するための十分な情報がありません。あなたがどの患者にベッドを与えようとしているのかわかりません。以下では@PatientIdToGiveBed、あなたの例のように、すべての「患者」に同じベッドを与えることを指定するためにを使用しました。ベッドが選択されているのと同じ方法で、最初の「入院中」を選択するようにこれを変更する必要がある可能性があります。

トランザクションには、2つのトランザクションが同じベッドを割り当てないようにする分離レベルが必要REPEATABLE READです。デフォルトを使用した場合READ COMMITTED、2つのトランザクションが同じベッドを選択する可能性があります。このようにしREAD LOCKて、トランザクションが完了するまで、選択したベッドでaが保持されます。

以下のステートメント全体をSSMSに入れて実行し、テストすることができます。

DECLARE @Bed TABLE  (
    b_ID INT,
    Status_Avai_Occ VARCHAR(20)
)

DECLARE @Patient_Record TABLE (
    Id INT, 
    Name VARCHAR(10),
    b_ID INT
)

INSERT INTO @Bed VALUES (1, 'Available') 
INSERT INTO @Bed VALUES (2, 'Available') 
INSERT INTO @Bed VALUES (3, 'Available') 

INSERT INTO @Patient_Record VALUES (1, 'Adam', NULL) 
INSERT INTO @Patient_Record VALUES (2, 'Ben', NULL) 
INSERT INTO @Patient_Record VALUES (3, 'Charles', NULL) 

DECLARE @PatientIdToGiveBed INT = 1

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ 
BEGIN TRANSACTION 
    DECLARE @Available_BID INT
    SELECT TOP 1 @Available_BID = b_ID FROM @BED WHERE Status_Avai_Occ = 'Available' ORDER BY b_ID

    IF @Available_BID IS NULL 
    BEGIN
        Print 'No Beds Available'
        COMMIT 
        RETURN 
    END 

    UPDATE @Patient_Record SET b_ID = @Available_BID WHERE Id = @PatientIdToGiveBed 
    UPDATE @Bed SET Status_Avai_Occ = 'Occupied' WHERE b_ID = @Available_BID 
COMMIT 

SELECT * FROM @Patient_Record
SELECT * FROM @Bed
于 2013-03-19T09:20:08.390 に答える
2
  1. 単一のクエリで 2 つのテーブルを更新することはできません (トランザクションを使用する必要があります)。

  2. あなたはこのようなことを試すことができます

Begin Tran

update Patient_Record 
set b_ID = b.b_ID from bed b where b.Status_Avai_Occ = 'Available'
and Patient_Record.Admission_Type = 'In Patient'

Update bed set Status_Avai_Occ='Occupied' where b_ID in (select b_ID from Patient_Record where Patient_Record.Admission_Type = 'In Patient')
Commit Tran
于 2013-03-19T09:22:08.067 に答える
2

一度に一連の患者に対してこれを本当に実行したい場合は、最初にベッドを一致させてから割り当てる必要があります。SQL Server には一度に 2 つのテーブルを更新する方法がないためです。 select は毎回異なる bed_ID を生成します。

-- Set up some temp tables to hold data
DECLARE @availBeds table (num int identity(1,1), b_ID int)
DECLARE @inPatients table (num int identity(1,1), p_ID int)
DECLARE @patientBeds table (p_ID int, b_ID int)

-- Populate table of available beds only, giving them a unique incremental ID
INSERT INTO @availBeds SELECT b_ID FROM Bed WHERE status_avai_occ = 'Available'

-- Populate table of in patients without assigned beds only, giving them a unique incremental ID
INSERT INTO @inPatients SELECT p_ID FROM Patient_Record WHERE admission_type = 'In Patient' AND b_ID IS NULL

-- Join the two tables above based on their incremental ID's,
-- effectively matching up available beds with patients
INSERT INTO @patientBeds
    SELECT p.p_ID, b.b_ID FROM @inPatients p
    INNER JOIN @availBeds b ON b.num = p.num

-- Update Patient_Record with the new bed ID's
UPDATE p
SET p.b_ID = b.b_ID
FROM Patient_Record p
INNER JOIN @patientBeds b ON p.p_ID = b.p_ID

-- Set the Beds to Occupied
UPDATE Bed SET status_avai_occ = 'Occupied' WHERE b_ID IN (SELECT b_ID FROM @patientBeds)

デモ

于 2013-03-19T09:20:57.393 に答える
2

SQL Server では、1 つの UPDATE ステートメントで複数のテーブルを更新することはできませんが、次のように、2 つの更新を 1 つのトランザクションで単純にラップすることができます。

DECLARE @b_ID INT
SELECT TOP 1 @b_ID = b_ID FROM bed WHERE Status_Avai_Occ = 'Available'

BEGIN TRAN Update_Patient

UPDATE  Patient_Record 
  SET   b_ID = @b_ID
  WHERE Admission_Type = 'In Patient' 

UPDATE  bed
  SET   Status_Avai_Occ = 'Occupied'
  WHERE (b_ID = @b_ID)

COMMIT TRAN Update_Patient
于 2013-03-19T08:57:52.253 に答える
2
1. set variable "openBed" to available bed id
2. update bed with bed id = openBed to 'Occupied'
3. update patient_record set bed id = openBed where admission_type = 'in patient'

注: 3 番目のステートメントIn Patientは、テーブル内のすべてのレコードを毎回Patient_Record同じベッド ID に更新します。つまり、新しい患者が入院するたびに、すべての患者が次に利用可能なベッドに再割り当てされます。それはかなり混雑したベッドになります。

于 2013-03-19T08:58:17.583 に答える
0

これにより、すべてのPatientRecordsがAdmission_Type=で更新されます。In Patient

私があなたの構造を完全に理解しているかどうかはわかりませんが、あなたはこれを行うことができます:

DECLARE @AvailableBID INT
SELECT TOP 1 @AvailableBID = b_ID FROM bed WHERE Status_Avai_Occ = 'Available'

UPDATE Patient_Record 
SET b_ID = @AvailableBID
WHERE Admission_Type = 'In Patient'

UPDATE bed
SET Status_Avai_occ = 'Occupied'
WHERE b_ID = @AvailableBid

これにより、すべてのPatient_recordsがAdmission_TypeInPatientで更新されることに注意してください。追加のフィルター、つまり行番号を適用する必要があります。

http://sqlfiddle.com/#!6/fa26d/9

コメントから編集

DECLARE @AvailableBID INT
DECLARE @AvailablePatientRecord INT

SELECT TOP 1 @AvailableBID = b_ID FROM bed WHERE Status_Avai_Occ = 'Available'
SELECT TOP 1 @AvailablePatientRecord  = PatientRecordId FROM Patient_Record WHERE Admission_Type = 'In Patient'

UPDATE Patient_Record 
SET b_ID = @AvailableBID
WHERE PatientRecordId = @AvailablePatientRecord

UPDATE bed
SET Status_Avai_occ = 'Occupied'
WHERE b_ID = @AvailableBid

注:Patient_RecordテーブルにPatientRecordIdがあることを確認する必要があります

于 2013-03-19T08:55:10.850 に答える