Абнаўленне радкоў у адной табліцы з дадзенымі з іншай табліцы на аснове аднаго слупка у кожным роўных

Абнаўленне <�моцнага> шмат радкоў </моцны> ў адну табліцу з іншай табліцы на аснове аднаго слупка у кожным роўных умовах (user_id).

абедзве табліцы маюць user_id калонкі. Неабходна ўставіць дадзеныя з t2 у t1 калі user_id калонкі роўныя.

Загадзя дзякуй за любую дапамогу прапанавалі.

37
Upvoted. См роднасны пытанне: stackoverflow.com/q/7030699/435605
дададзена аўтар AlikElzin-kilaka, крыніца

5 адказы

update 
  table1 t1
set
  (
    t1.column1, 
    t1.column2
      ) = (
    select
      t2.column1, 
      t2.column2
    from
      table2  t2
    where
      t2.column1 = t1.column1
     )
    where exists (
      select 
        null
      from 
        table2 t2
      where 
        t2.column1 = t1.column1
      );

Or this (if t2.column1 <=> t1.column1 are many to one and anyone of them is good):

update 
  table1 t1
set
  (
    t1.column1, 
    t1.column2
      ) = (
    select
      t2.column1, 
      t2.column2
    from
      table2  t2
    where
      t2.column1 = t1.column1
    and
      rownum = 1    
     )
    where exists (
      select 
        null
      from 
        table2 t2
      where 
        t2.column1 = t1.column1
      ); 
50
дададзена
Гэты адказ абнаўляе больш радкоў, чым неабходна. Дадатковы , дзе патрэбны. См адказ Тоні Эндрус.
дададзена аўтар AlikElzin-kilaka, крыніца
@ AlikElzin-kilaka, якія выпраўляюцца, дзякуй за ўказанне на памылку!
дададзена аўтар Dimitre Radoulov, крыніца
@JohnRose, вы Сардэчна запрашаем!
дададзена аўтар Dimitre Radoulov, крыніца
Ёсць шмат іншых адказаў на гэтае ў іншым месцы ў SO, але гэта толькі адзін, які працаваў для мяне, і гэта выратавала маю бекон. Дзякуй!
дададзена аўтар Ian, крыніца
Вялікі дзякуй. Працуе як шарм пасля адкарэктаваных дадзеных для ліквідацыі дублікатаў !!!
дададзена аўтар JcR49, крыніца
Гэты адказ з'яўляецца правільным і вельмі карысна. Дзякуй.
дададзена аўтар JcR49, крыніца

Калі вы хочаце абнавіць адпаведныя радкі ў t1 з дадзенымі t2, тады:

update t1
set (c1, c2, c3) = 
(select c1, c2, c3 from t2
 where t2.user_id = t1.user_id)
where exists
(select * from t2
 where t2.user_id = t1.user_id)

«Дзе існуе» частка яго, каб пазбегнуць ягонага абнаўлення слупкоў t1 да нуля, дзе супадзення не існуе.

25
дададзена
Upvoted. См аналагічны адказ: stackoverflow.com/a/7031405/435605
дададзена аўтар AlikElzin-kilaka, крыніца
Гэта дапамагло мне, дзякуй!
дададзена аўтар AndeeC, крыніца
Так user_id не з'яўляецца унікальным у t1? У гэтым выпадку, як вы ведаеце, , якія t1, каб атрымаць значэння з?
дададзена аўтар Tony Andrews, крыніца
«Адзін запыт радкі вяртае колькасць радкоў» памылка азначае, што на працягу некаторага user_id ёсць 2 (ці больш) радкі ў t2. Так як ваш апошні каментар быў няправільна або база дадзеных пашкоджана!
дададзена аўтар Tony Andrews, крыніца
Дзе Exists з'яўляецца важнай часткай, асабліва калі вы абнаўляеце з меншай табліцы, якая мае толькі падмноства дадзеных у нашмат большую табліцу. Значнае павышэнне хуткасці.
дададзена аўтар AnthonyVO, крыніца
Не ўпэўнены, што я правільна operatoing гэта .... Гэты адказ з'яўляецца правільным і вельмі карысна. Дзякуй.
дададзена аўтар JcR49, крыніца
Дзякуй. Працуе выдатна.
дададзена аўтар JcR49, крыніца
Дзякуй ..... Павінен быць толькі адзін ... Я павінен быў заявіў, я буду глядзець больш уважліва. Я цаню дапамогу.
дададзена аўтар JcR49, крыніца
Так, ёсць толькі адзін сябар user_id. Абедзве табліцы мае адзін слупок user_id і мае адпаведныя запісы, але ёсць толькі адзін user_id для кожнага карыстальніка ....
дададзена аўтар JcR49, крыніца
Ёсць каля тысячы радкоў, якія будуць абноўлены .......
дададзена аўтар JcR49, крыніца
Дзякуй. Як і іншыя пытанні, якія я паспрабаваў, гэта вяртае «адзін запыт радкі Rturns шмат радкоў» .. Ня ўставіць/абнавіць што-небудзь.
дададзена аўтар JcR49, крыніца
merge into t2 t2 
using (select * from t1) t1
on (t2.user_id = t1.user_id)
when matched then update
set
   t2.c1 = t1.c1
,  t2.c2 = t1.c2
14
дададзена

Гэта не устаўка, калі запіс ўжо існуе ў t1 (user_id запалкі), калі вы не шчаслівыя стварыць дублікаты user_id гадоў.

Вы можаце абнаўленне?

UPDATE t1
   SET  = (SELECT 
                          FROM t2
                         WHERE t2.user_id = t1.user_id)
 WHERE EXISTS
      (SELECT 1
         FROM t2
        WHERE t1.user_id = t2.user_id);

Спадзяюся, што гэта дапамагае ...

5
дададзена
Вы атрымаеце паведамленне пра памылку ORA-01427, калі адносіны не адзін да аднаго. Гэта азначае, што ваш эквисоединения аператар не можа паспяхова адпавядаць адзін запіс у табліцы адзін да аднаго запісу ў табліцы два.
дададзена аўтар Nathan, крыніца
ОР-01427: однорядный подзапросов вяртае больш аднаго радка
дададзена аўтар JcR49, крыніца
Я працягваю вяртацца да таго ж гарлапаню 01427 однорядная запыце вяртае больш аднаго радка.
дададзена аўтар JcR49, крыніца

Вы заўсёды маглі б выкарыстоўваць і пакінуць па-за «когда не ўзгоднены раздзел»

merge into table1 FromTable   
   using table2 ToTable
     on     ( FromTable.field1 = ToTable.field1
          and  FromTable.field2 =ToTable.field2)
when Matched then
update set 
  ToTable.fieldr = FromTable.fieldx,
  ToTable.fields = FromTable.fieldy, 
  ToTable.fieldt =  FromTable.fieldz)
when not matched then
  insert  (ToTable.field1,
       ToTable.field2,
       ToTable.fieldr,
       ToTable.fields,
       ToTable.fieldt)
  values (FromTable.field1,
         FromTable.field2,
         FromTable.fieldx,
         FromTable.fieldy,
         FromTable.fieldz);
2
дададзена