Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何更新满足SQL server中SELECT语句内条件的特定行的值_Sql_Sql Server_Sql Server 2012 - Fatal编程技术网

如何更新满足SQL server中SELECT语句内条件的特定行的值

如何更新满足SQL server中SELECT语句内条件的特定行的值,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,我有像“床”和“绳子”这样的桌子。我想为患者分配一张空床(即从床位表以status=“Available”进行出价),然后将出价状态更改为“已占用”。请帮忙。以下是我当前的查询,但我不确定如何继续 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 "Occup

我有像“床”和“绳子”这样的桌子。我想为患者分配一张空床(即从床位表以status=“Available”进行出价),然后将出价状态更改为“已占用”。请帮忙。以下是我当前的查询,但我不确定如何继续

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' 

这将使用患者的入院类型更新所有患者记录

我不确定我是否完全理解您的结构,但您可以这样做:

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
注意:这仍将使用患者中的入院类型更新所有患者记录。您将需要应用一个附加过滤器,即行号

从评论中编辑

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

注意:您必须确保在患者记录表中有一个PatientRecord,SQL Server不允许您在一个update语句中更新多个表,但是您可以在一个事务中简单地包装这两个更新,如下所示:

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

注意:3rd语句将每次将
Patient\u record
表中的每个
住院患者
记录更新为相同的床位id。换句话说,每次新患者入院时,每个患者都将被重新分配到下一张可用的床上。那将是一张非常拥挤的床。

我想你之所以觉得这很难,是因为你的设计有缺陷,但没有足够的信息来纠正这一点。我不确定您要为哪位患者提供床位,在下面的示例中,我使用了
@PatientIdToGiveBed
来指定您将为所有“住院患者”提供同一张床。您可能需要修改此选项,以选择第一个“住院患者”,方式与选择床位相同

事务需要有一个隔离级别
可重复读取
,这将阻止两个事务分配同一张床,如果使用默认的
读取提交
,两个事务可以选择同一张床。通过这种方式,
读取锁定
将保持在所选床上,直到交易完成

您可以将下面的整个语句放入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

如果确实要在一组患者中同时运行此操作,则需要首先匹配床位,然后分配床位,因为在SQL Server中无法同时更新两个表,因此基于集合的选择每次将生成不同的床位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)

  • 不能在单个查询中更新2个表(需要使用事务)

  • 你可以试试这样的


  • 我认为这是一个基于集合的操作,将不同的床位分配给所有住院患者,如果你将其包装在一个事务中,那么整个过程要么全部完成,要么全部撤销RDBMS@DavidHedlund啊,好吧-我会让OP澄清这一点并调整。谢谢。我的问题和大卫提到的一样。我想为住院患者分配不同的“可用”床位,这意味着每次分配“可用”床位后,我想立即将状态更改为“已占用”这样我就不会一直为所有的病人分配同一张床了…如果问题让人困惑,很抱歉…请帮我解决这个问题…谢谢advance@Gayu-Patient_Record表是否有入院类型为“In Patient”的条目?我尝试了此查询,但我的Patient_记录没有更新。只有床头柜更新了:(请帮忙
    -- 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)
    
    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