0

次のステートメントでデータを選択しています。

select distinct min(revision_number) as revno,po_number 
from PO_HEADER 
group by PO_NUMBER
having MIN(revision_number) > 0;

次のデータを取得します。

7   30492-SA-EH504
20  30492-PS-SO895
20  30492-RA-DD219
26  30492-SA-KK474
1   30492-BA-AT236
17  30492-RA-DD386
21  30492-PS-FS803
25  30492-PS-WM324
33  30492-SA-NS011

MIN(REVISION_NUMBER)他の値を変更せずに を ZEROに更新したい。たとえば30492-SA-EH504、リビジョンを次のようにリストします。

30492-SA-EH504 7
30492-SA-EH504 8
30492-SA-EH504 9
30492-SA-EH504 10

現在の最小リビジョン (7) をゼロに更新したいだけです。この更新クエリを試しましたが、すべてがゼロに更新されました。

update PO_HEADER
set REVISION_NUMBER = '0'
from PO_HEADER
where exists (
select min(revision_number) as revno,po_number 
from PO_HEADER
group by PO_NUMBER
having MIN(revision_number) > 0
);

明確なヘルプを選択しますか、それとももっと複雑なものが必要ですか?

4

4 に答える 4

4

これを解決する別の方法があります。共通テーブル式を実際に更新できます。

with mins as (
  select po_number, revision_number
  from (
  select po_number, revision_number,
    row_number() over (partition by po_number order by revision_number) n
  from Table1
  ) A
  where A.n = 1
)
update mins set revision_number = 0

select * from Table1

SQLフィドルはこちら。

于 2012-05-23T21:05:17.203 に答える
1

何かのようなもの

UPDATE poh
  SET poh.RevisionNumber = 0
  FROM POHeader AS poh
  INNER JOIN (select distinct min(revision_number) as revno,po_number 
              from PO_HEADER 
              group by PO_NUMBER
              having MIN(revision_number) > 0) AS poh_rev
  ON poh.PO_Number = poh_rev.PO_Number And poh.RevisionNumber = poh_rev.revno
于 2012-05-23T21:11:42.340 に答える
1
Update PO_HEADER
Set revision_number = 0
From (
      select distinct min(revision_number) as revno,po_number  
      from PO_HEADER
      group by PO_NUMBER 
      having MIN(revision_number) > 0
      )Z
Where PO_HEADER.revision_number = Z.revno
  and PO_HEADER.po_number = Z.po_number
于 2012-05-24T04:53:14.170 に答える
1

これを行うには複数の方法があります。「IN」句を使用する方が好きです。

update PO_HEADER
    set REVISION_NUMBER = '0'
    where (po_header.Revision_NUMBER, po_header.po_number) in 
              (select min(revision_number) as revno, po_number
               from PO_HEADER
               group by PO_NUMBER
               having MIN(revision_number) > 0
              )

元のクエリには、更新テーブルの行と条件の間に関連性がありません。したがって、条件が true (行が存在する) であるため、すべてが true と評価されます。上記の構文はmysqlで機能すると思います-「IN」を使用してペアを探します。そうでない場合は、次を使用できます。

update PO_HEADER
    set REVISION_NUMBER = '0'
    from (select min(revision_number) as revno, po_number
          from PO_HEADER
          group by PO_NUMBER
          having MIN(revision_number) > 0
         ) minr
    where po_header.Revision_NUMBER = minr.Revision_NUMBER and
         po_header.po_number = minr.po_number
于 2012-05-23T21:03:44.943 に答える