如何根据行在headertable中设置flag
How to set the flag in header table on the basis of lines
我有销售 header 和销售线 table。例如SalesID = 1 在销售行 table.
中有 2 个销售行
销售头:
销售 ID = 1,活动 = 1
如果所有行的销售状态都已开具发票,我想将活动标志设置为 0
销售线
SalesID = 1,lineNum = 1,SalesStatus = Invoiced
SalesID = 1 , lineNum = 2, SalesStatus = Open Order
在这种情况下,我不想在 header table 中将活动标志更改为 0,因为同一销售订单中的 1 行是未结订单。
如果所有行都开具发票,我想更改活动标志 = 0。
1- 找到您需要更新的 ID。您可以检查一个 ID 的所有可用 salesLines 的数量,并将其与“Invoiced”计数的总数进行比较,这应该与其更新的标志相匹配。您可以将这些 ID 保存到单独的临时 table,因为您也可以使用 table 类型的变量或“with cte”结构。
SELECT SalesId
into #SalesHavingAllInvoicedLines
from
(
SELECT SalesId,
COUNT(*) totCount,
SUM(CASE WHEN SalesStatus ='invoiced' THEN 1 ELSE 0 END) InCount
FROM SalesLines
GROUP BY SalesId
) x
WHERE x.totCount=x.InCount
2- 使用“内部连接”对您在步骤 1 中创建的临时 table 进行更新。
update s
set Active=0
from SalesHeader s
inner join #SalesHavingAllInvoicedLines s2 on s.SalesId=s2.SalesId
通常,当不需要精确值时,exists
的性能优于 count
或 sum
。您所描述的内容的一个相当清楚的表达是:
update SalesHeader
set Active = 0
where not exists ( -- Note: NOT exists.
-- Find all of the corresponding sales lines with a sales status other than "Invoiced" .
select 42
from SalesLines as SL
where SL.SalesId = SalesHeader.SalesId and SL.SalesStatus <> 'Invoiced' );
SalesLines
table 上 SalesId
的索引(包括 SalesStatus
会很有用。
请注意,如果 SalesLines
中有 没有 行具有匹配的 SalesId
,则 Active
将设置为 0
.
我有销售 header 和销售线 table。例如SalesID = 1 在销售行 table.
中有 2 个销售行销售头:
销售 ID = 1,活动 = 1
如果所有行的销售状态都已开具发票,我想将活动标志设置为 0
销售线
SalesID = 1,lineNum = 1,SalesStatus = Invoiced
SalesID = 1 , lineNum = 2, SalesStatus = Open Order
在这种情况下,我不想在 header table 中将活动标志更改为 0,因为同一销售订单中的 1 行是未结订单。
如果所有行都开具发票,我想更改活动标志 = 0。
1- 找到您需要更新的 ID。您可以检查一个 ID 的所有可用 salesLines 的数量,并将其与“Invoiced”计数的总数进行比较,这应该与其更新的标志相匹配。您可以将这些 ID 保存到单独的临时 table,因为您也可以使用 table 类型的变量或“with cte”结构。
SELECT SalesId
into #SalesHavingAllInvoicedLines
from
(
SELECT SalesId,
COUNT(*) totCount,
SUM(CASE WHEN SalesStatus ='invoiced' THEN 1 ELSE 0 END) InCount
FROM SalesLines
GROUP BY SalesId
) x
WHERE x.totCount=x.InCount
2- 使用“内部连接”对您在步骤 1 中创建的临时 table 进行更新。
update s
set Active=0
from SalesHeader s
inner join #SalesHavingAllInvoicedLines s2 on s.SalesId=s2.SalesId
通常,当不需要精确值时,exists
的性能优于 count
或 sum
。您所描述的内容的一个相当清楚的表达是:
update SalesHeader
set Active = 0
where not exists ( -- Note: NOT exists.
-- Find all of the corresponding sales lines with a sales status other than "Invoiced" .
select 42
from SalesLines as SL
where SL.SalesId = SalesHeader.SalesId and SL.SalesStatus <> 'Invoiced' );
SalesLines
table 上 SalesId
的索引(包括 SalesStatus
会很有用。
请注意,如果 SalesLines
中有 没有 行具有匹配的 SalesId
,则 Active
将设置为 0
.