2012-05-23 40 views
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)零而不改變任何其他值。例如,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

下面是解決它的另一種方法。實際上,你可以更新公用表表達式:

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 Fiddle here.

+0

偉大的答案!另外,感謝您提供到SQL Fiddle的鏈接。這是一個我不知道的令人驚訝的工具。 – user1059110

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 
      ) 

您的原始查詢在更新表中的行與條件之間沒有連接。因此,所有的評估都是真實的,因爲條件是真實的(行存在)。我認爲上面的語法在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 
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 
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