2015-02-03 3 views
0

Я хочу сравнить datetimes и удалить строки, которым больше 72 часов. Затем я хочу обновить другую таблицу булевых «HasClone». Как получить int (ID) от первого выбора в другой? см. код ниже:Получить Выбранные значения в SQL

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 

Итак, в разделе «ВСТАВИТЬ КОД ЗДЕСЬ!». Я хочу, чтобы вставить ID, я только что получил от Allocation_plan_details_Clone

ответ

2

Если я понял ваш вопрос права я думаю, что вы хотите это:

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 
) 
+0

Это именно то, что я хотел. Спасибо, сэр! – Purrx

0

Если я правильно Вас понял, вы могли бы просто сделать временную таблицу (который находится на связи с базой данных и удаляет себя, как только вы уронили соединение

это бы что-то вроде этого:.

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 
; 

T курица вы можете делать все, что вы хотите с этим темп таблицы, такие как:

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

Примечание: Не уверен, что СУБД вы работаете на, однако MSSQL имеет хэштегом, который ссылается на временные таблицы. Postgres Я не думаю, что вам нужно это сделать и не уверен в других СУБД.

0

вы можете использовать временную таблицу для хранения 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 
1

Этот ответ является принятие 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; 
Смежные вопросы