如何根据行在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 的性能优于 countsum。您所描述的内容的一个相当清楚的表达是:

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.