簡體   English   中英

在SQL中獲取選定的值

[英]Get Selected values in SQL

我想比較日期時間並刪除超過72小時的行。 然后,我想更新另一個表布爾“ HasClone”。 如何從第一個選擇中獲取整數(ID)? 參見下面的代碼:

 SELECT Allocation_plan_details_Clone.Allocation_plan_id AS ID
         FROM Allocation_plan_details_Clone
         WHERE DATEDIFF(hour, start_date, GETDATE()) > 72
         UPDATE Allocation_plan
         SET HasClone = 0
         WHERE allocation_plan_id = <INSERT CODE HERE!>
         DELETE FROM Allocation_plan_details_Clone
         WHERE DATEDIFF(hour, start_date, GETDATE()) > 72

所以在“在這里插入代碼!” 我想插入剛從Allocation_plan_details_Clone獲得的ID

如果我正確理解了您的問題,我想您想要的是:

UPDATE Allocation_plan
SET HasClone = 0
WHERE allocation_plan_id IN (
    SELECT Allocation_plan_details_Clone.Allocation_plan_id
    FROM Allocation_plan_details_Clone
    WHERE DATEDIFF(hour, start_date, GETDATE()) > 72
)

這個答案是在刪除行的同時將Allocation_plan_id放入表變量中。

事務確保不更新Allocation_plan表就不會刪除數據。

我重寫了您的WHERE語句,以使其表現更好。

begin transaction t

DECLARE @deleted table(Allocation_plan_id int)

DELETE Allocation_plan_details_Clone
OUTPUT deleted.Allocation_plan_id
INTO @deleted
FROM Allocation_plan_details_Clone
WHERE start_date < dateadd(hour, -72, GETDATE())

UPDATE Allocation_plan
SET HasClone = 0
FROM Allocation_plan
JOIN
@deleted d
ON d.Allocation_plan_id = Allocation_plan.Allocation_plan_id

commit transaction t;

如果我理解正確,您可以制作一個臨時表(該表位於該數據庫連接上,並在刪除該連接后立即刪除自身)。

它會像這樣:

SELECT Allocation_plan_details_Clone.Allocation_plan_id AS ID INTO #temp_table
         FROM Allocation_plan_details_Clone
         WHERE DATEDIFF(hour, start_date, GETDATE()) > 72
         UPDATE Allocation_plan
         SET HasClone = 0
         WHERE allocation_plan_id = <INSERT CODE HERE!>
         DELETE FROM Allocation_plan_details_Clone
         WHERE DATEDIFF(hour, start_date, GETDATE()) > 72
;

然后,您可以使用此臨時表執行任何操作,例如:

delete
from other_table
where id in (select id from #temp_table)
;

注意:不確定正在運行的DBMS,但是MSSQL具有引用臨時表的#標簽。 Postgres我認為您不需要這樣做,並且不確定其他DBMS。

您可以使用臨時表來保存所需的IDS,就像這樣

SELECT Allocation_plan_details_Clone.Allocation_plan_id AS ID
into #TempTable
FROM Allocation_plan_details_Clone
WHERE DATEDIFF(hour, start_date, GETDATE()) > 72

UPDATE a
SET HasClone = 0
WHERE allocation_plan_id in (select ID from #TempTable)

DELETE FROM Allocation_plan_details_Clone
WHERE DATEDIFF(hour, start_date, GETDATE()) > 72

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM