Oracle SQL әрбір n-ші қатарда жаңартады

Жаңа кесте өрісінде қандай да бір тестілеуді жасау үшін, менің деректер базасындағы жазбалардағы кейбір мәндерді жалған жасауды қалаймын. Кестеде әрбір 8-ші жазбаға мән бергім келеді. Осы синтаксисті пайдаланып әрбір 8-ші жазбаны оңай таңдай аламын:

select *
from 
  (select rownum rn
    , jeffs_field_to_update
  from jeff)
where mod(rn, 8) = 0;

Дегенмен, мен SQL-ке мүлдем жаңа болып отырмын және оны жаңарту мәлімдемесіне айналдыруға болмайды. Мен мұнда N-жазбаларды таңдау туралы көптеген жауаптар көріп жатырмын, бірақ мен бұны алдым. Кез келген көмекті бағалайтын болар еді.

5
Сіздің кестеңізде бастапқы кілт бар ма? Қандай тапсырыс «әрбір 8-ші жазбаны» басқарады немесе қандай жолдар жаңартылады?
қосылды автор APC, көзі
Мен Михаилдың жауабын қолданып, бірақ сіздің сұрағыңызға жауап беру үшін, мен жаңартылғандарға шынымен де мән бермедім - тек үстелдің барлық бөліктерінде таратылған ауқымды жиынтықты алғым келді.
қосылды автор Travis, көзі

7 жауаптар

Бұл кестеге кез келген кілтте UPDATE мәлімдемесіне қосылу керек. Мысалы, сізде бірегей идентификатор бағаны болса, жаңарту мәлімдемесі келесідей болады:

update jeff
set jeffs_field_to_update = value
where id in
(select id
from 
  (select rownum rn
    , jeff.id
  from jeff)
where mod(rn, 8) = 0)
5
қосылды
Рақмет сізге! Бұл тамаша жұмыс істейді.
қосылды автор Travis, көзі

Бұл кестеге кез келген кілтте UPDATE мәлімдемесіне қосылу керек. Мысалы, сізде бірегей идентификатор бағаны болса, жаңарту мәлімдемесі келесідей болады:

update jeff
set jeffs_field_to_update = value
where id in
(select id
from 
  (select rownum rn
    , jeff.id
  from jeff)
where mod(rn, 8) = 0)
5
қосылды
Рақмет сізге! Бұл тамаша жұмыс істейді.
қосылды автор Travis, көзі

Қысқа жауап:

UPDATE jeff 
SET jeffs_field_to_update = value 
WHERE mod(DBMS_ROWID.ROWID_ROW_NUMBER(ROWID), 8)=0;
4
қосылды

Қысқа жауап:

UPDATE jeff 
SET jeffs_field_to_update = value 
WHERE mod(DBMS_ROWID.ROWID_ROW_NUMBER(ROWID), 8)=0;
4
қосылды

Әр кестені анықтау үшін кестеңізді бірегей идентификаторға ие бола отырып, сіз келесідей бірдеңені жасай аласыз:

update jeff
    set . . .
    where id in (select id
                 from (select rownum as rn, id
                       from jeff
                      )
                 where mod(rn, 8) = 0
                )

Сондай-ақ, оны кірістірілген жаңартылатын көрініспен жасай аласыз (қараңыз: мұнда ):

update (select jeffs_field_to_update
        from  (select rownum rn, jeffs_field_to_update
              from jeff)
        where mod(rn, 8) = 0
       ) toupdate
    set . . .
1
қосылды

тіпті кілтсіз болса да, осы мақсат үшін оракетті қолдануға болады.

update mytable
set mycol = new_value
where rowid in
(select rowid from 
  (select rownum rn, id from mytable)
where mod(rn, 8) = 0)
1
қосылды
Мұнда барлық жақсы жауаптар бар. Рахмет!
қосылды автор Travis, көзі

тіпті кілтсіз болса да, осы мақсат үшін оракетті қолдануға болады.

update mytable
set mycol = new_value
where rowid in
(select rowid from 
  (select rownum rn, id from mytable)
where mod(rn, 8) = 0)
1
қосылды
Мұнда барлық жақсы жауаптар бар. Рахмет!
қосылды автор Travis, көзі