SQL服务器subquery/derivedtable更新语句
SQL Server subquery/derived table update statement
我正在尝试编写一个在 From
子句中使用派生的 table(?) 的更新语句。此更新语句需要一次更新 3 列。派生的 table 选择前 6 个并按 desc 顺序对它们进行排序,这样当我更新它们时它选择前 1 个它实际上是第 6 个(在其他语句中我得到第 1、2、3。 ..等等,我现在只写第 6 个,因为它们都一样(或多或少))
我的问题是我需要在派生的 table "where" 子句中指定要抓取哪一组 6。我有 "t1.trace_ID = t2.trace_ID" 但这不起作用,因为 t2 在子查询之外。
我需要找到一种方法来根据Trace_ID来确定要抓取哪一组数据。
有什么建议吗?
update t2
set RWK6_OPERATION_CODE = (select top 1 O_C.OPERATION_CODE),
RWK6_REASON = (Select top 1 O_C.REWORK_REASON),
RWK6_DATE = (Select top 1 o_C.OPERATION_CODE)
From plant.PIECE_DETAIL t2
inner join
(Select top 6
t1.TRACE_ID
,t1.OPERATION_CODE
,t1.REWORK_REASON
,t1.OPERATION_START_DATE_D
from app.OHCMS_ITEM_OPERATION_TRACE t1
where *t1.TRACE_ID = t2.TRACE_ID*
and REWORK_REASON is not null
order by OPERATION_START_DATE_D, OPERATION_START_TIME desc) as O_C
on O_C.TRACE_ID = t2.TRACE_ID
Where t2.rwk_cycle > 5
您可以将其表述为 cross apply
:
From plant.PIECE_DETAIL t2 cross apply
(Select top 6 t1.*
from app.OHCMS_ITEM_OPERATION_TRACE t1
where t1.TRACE_ID = t2.TRACE_ID and
REWORK_REASON is not null and
t1.TRACE_ID = t2.TRACE_ID
order by OPERATION_START_DATE_D, OPERATION_START_TIME desc
) O_C
Where t2.rwk_cycle > 5
这略有不同,因为它在子查询中找到匹配的行,然后 然后 获取前 6 行。您的原始内容似乎获取前 6 行,而 然后进行匹配。我不确定您真正想要哪种逻辑,但您可以使用附加子查询或将外部比较移动到 where
子句来实现原始逻辑。
我正在尝试编写一个在 From
子句中使用派生的 table(?) 的更新语句。此更新语句需要一次更新 3 列。派生的 table 选择前 6 个并按 desc 顺序对它们进行排序,这样当我更新它们时它选择前 1 个它实际上是第 6 个(在其他语句中我得到第 1、2、3。 ..等等,我现在只写第 6 个,因为它们都一样(或多或少))
我的问题是我需要在派生的 table "where" 子句中指定要抓取哪一组 6。我有 "t1.trace_ID = t2.trace_ID" 但这不起作用,因为 t2 在子查询之外。
我需要找到一种方法来根据Trace_ID来确定要抓取哪一组数据。
有什么建议吗?
update t2
set RWK6_OPERATION_CODE = (select top 1 O_C.OPERATION_CODE),
RWK6_REASON = (Select top 1 O_C.REWORK_REASON),
RWK6_DATE = (Select top 1 o_C.OPERATION_CODE)
From plant.PIECE_DETAIL t2
inner join
(Select top 6
t1.TRACE_ID
,t1.OPERATION_CODE
,t1.REWORK_REASON
,t1.OPERATION_START_DATE_D
from app.OHCMS_ITEM_OPERATION_TRACE t1
where *t1.TRACE_ID = t2.TRACE_ID*
and REWORK_REASON is not null
order by OPERATION_START_DATE_D, OPERATION_START_TIME desc) as O_C
on O_C.TRACE_ID = t2.TRACE_ID
Where t2.rwk_cycle > 5
您可以将其表述为 cross apply
:
From plant.PIECE_DETAIL t2 cross apply
(Select top 6 t1.*
from app.OHCMS_ITEM_OPERATION_TRACE t1
where t1.TRACE_ID = t2.TRACE_ID and
REWORK_REASON is not null and
t1.TRACE_ID = t2.TRACE_ID
order by OPERATION_START_DATE_D, OPERATION_START_TIME desc
) O_C
Where t2.rwk_cycle > 5
这略有不同,因为它在子查询中找到匹配的行,然后 然后 获取前 6 行。您的原始内容似乎获取前 6 行,而 然后进行匹配。我不确定您真正想要哪种逻辑,但您可以使用附加子查询或将外部比较移动到 where
子句来实现原始逻辑。