SQL සේවාදායකයේ JOIN සමඟ යාවත්කාලීන ප්‍රකාශයක් කරන්නේ කෙසේද?


1327

මට මෙම වගුව SQL සේවාදායකයේ 'මව්' වගුවේ දත්ත සමඟ යාවත්කාලීන කිරීමට අවශ්‍යයි , පහත බලන්න:

වගුව: විකිණීම

id (int)
udid (int)
assid (int)

වගුව: ud

id  (int)
assid  (int)

sale.assidයාවත්කාලීන කිරීමට නිවැරදි අගය අඩංගු වේ ud.assid.

මෙය කරන්නේ කුමන විමසුමද? මම ඒ ගැන සිතමින් සිටින joinනමුත් එය කළ හැකිදැයි මට විශ්වාස නැත.


3
ඔබ භාවිතා කරන්නේ කුමන RDBMS ද? MySQL, SQL Server, Oracle, PostgreSQL හෝ වෙනත් දෙයක්?
ක්‍රිස් ජේ

වගු අතර සමහර සම්බන්ධතා? විකුණුම් වලින් කුමන වාර්තාවක් ud වෙතින් කුමන වාර්තාවට අනුරූප වේදැයි යමෙකු දැන ගන්නේ කෙසේද? වගු දෙකෙහිම මූලික යතුර ලෙස එය හැඳුනුම්පත මත පදනම් වී තිබේද?
Căt Plin Pitiș

ඔබට UD යාවත්කාලීන කරන්නේ කෙසේද? එහි ඇත්තේ සහායකයා පමණක් වන අතර එය තමන්ගේම හැඳුනුම්පතකි. පවතින සත්‍ය සාරධර්ම හා පිටපතෙහි ප්‍රති change ලයක් ලෙස ඔබ වෙනස් කිරීමට හෝ එකතු කිරීමට කැමති වාර්තා අනුව උදාහරණයක් දිය හැකිද?
බර්න්හාර්ඩ් හොෆ්මන්


Answers:


2408

සින්ටැක්ස් දැඩි ලෙස රඳා පවතින්නේ ඔබ භාවිතා කරන SQL DBMS මත ය. ANSI / ISO (aka ඕනෑම SQL DBMS මත වැඩ කළ යුතුය), MySQL, SQL Server සහ Oracle හි එය කළ හැකි ක්‍රම කිහිපයක් මෙන්න. මා යෝජනා කළ ANSI / ISO ක්‍රමය සාමාන්‍යයෙන් අනෙක් ක්‍රම දෙකට වඩා මන්දගාමී වනු ඇති බවට උපදෙස් දෙන්න, නමුත් ඔබ MySQL, SQL Server හෝ Oracle හැර SQL DBMS භාවිතා කරන්නේ නම්, එය යා හැකි එකම මාර්ගය විය හැකිය (උදා. ඔබේ SQL DBMS සහාය නොදක්වන්නේ නම් MERGE):

ANSI / ISO:

update ud 
     set assid = (
          select sale.assid 
          from sale 
          where sale.udid = ud.id
     )
 where exists (
      select * 
      from sale 
      where sale.udid = ud.id
 );

MySQL:

update ud u
inner join sale s on
    u.id = s.udid
set u.assid = s.assid

SQL සේවාදායකය:

update u
set u.assid = s.assid
from ud u
    inner join sale s on
        u.id = s.udid

PostgreSQL:

update ud
  set assid = s.assid
from sale s 
where ud.id = s.udid;

FROMPostgres සඳහා වන වගන්තියේ ඉලක්ක වගුව නැවත නැවත නොකළ යුතු බව සලකන්න .

ඔරකල්:

update
    (select
        u.assid as new_assid,
        s.assid as old_assid
    from ud u
        inner join sale s on
            u.id = s.udid) up
set up.new_assid = up.old_assid

SQLite:

update ud 
     set assid = (
          select sale.assid 
          from sale 
          where sale.udid = ud.id
     )
 where RowID in (
      select RowID 
      from ud 
      where sale.udid = ud.id
 );

3
MySQL set assid = s.assidවිය යුතු බව මට පෙනේ set u.assid = s.assid.
dotancohen

2
ANSI වාක්‍ය ඛණ්ඩයේ, =පේළි එකකට වඩා ආපසු ලබා දීමෙන් පසු SELECT කළහොත් කුමක් සිදුවේද ?
ගිණුම ඉවතට විසි කරන්න

2
@ ThrowawayAccount3Million එය බොහෝ විට අසාර්ථක වනු ඇත. AFAIK, මේ ආකාරයේ ක්‍රියාකාරිත්වය පරිමාණ අගයක් අපේක්ෂා කරන අතර ඒ වෙනුවට ප්‍රති set ල කට්ටලයක් ලබා දෙන්නේ නම් දෝෂයක් ඇති වේ.
ෆ්‍රැන්සිස් සාමිවරයා

7
OP ඔහුගේ වගුව සහ තීරු සඳහා වඩා හොඳ නම් කිහිපයක් තෝරා ගැනීමට මම ප්‍රාර්ථනා කරමි !! එය එතරම් කියවිය හැකි / බුද්ධිමත් නොවේ ...
එස්. සර්පූෂාන්

4
Postgre 9.3 භාවිතා කළේupdate ud set assid = s.assid
StackUnder

144

මෙය SQL සේවාදායකයේ ක්‍රියාත්මක විය යුතුය:

update ud 
set assid = sale.assid
from sale
where sale.udid = id

100

postgres

UPDATE table1
SET    COLUMN = value
FROM   table2,
       table3
WHERE  table1.column_id = table2.id
       AND table1.column_id = table3.id
       AND table1.COLUMN = value
       AND table2.COLUMN = value
       AND table3.COLUMN = value 

20
ප්‍රශ්නයේ භාවිතා වන වගුව / තීරු නම් භාවිතා කරන්නේ නම් පිළිතුර වඩාත් පහසු වනු ඇත. ඔබේ පිළිතුරේ වගු 3 ක් ඇත්තේ ඇයි?
ඇල්ෆොන්ක්ස්

50

සම්මත SQL ප්‍රවේශයක් වනු ඇත

UPDATE ud
SET assid = (SELECT assid FROM sale s WHERE ud.id=s.id)

SQL සේවාදායකයේ ඔබට සම්බන්ධ වීමක් භාවිතා කළ හැකිය

UPDATE ud
SET assid = s.assid
FROM ud u
JOIN sale s ON u.id=s.id

1
පළමු එක සමඟ, ඔබට තීරු 2+ සමඟ සැසඳිය නොහැක, නමුත් සම්බන්ධ වීම විශිෂ්ටයි.
makciook

6
akmakciook: හාහ්? ඔබට WHEREඅතිරේක තීරු සමඟ ගැලපීමට අවශ්‍ය නම් ඔබට වගන්තියේ තවත් කොන්දේසි එකතු කළ හැකිය .
සර්

2
නිකම්ම නිකම් ... නමුත් මම හිතන්නේ OP යන්නෙන් අදහස් කළේ sale.udid = ud.id. සහ sale.id නොවේ.
ස්කිපි වොන්ඩ්‍රේක්


26

JOIN -ing බහු වගු භාවිතා කරමින් සරල කළ යාවත්කාලීන විමසුම .

   UPDATE
        first_table ft
        JOIN second_table st ON st.some_id = ft.some_id
        JOIN third_table tt  ON tt.some_id = st.some_id
        .....
    SET
        ft.some_column = some_value
    WHERE ft.some_column = 123456 AND st.some_column = 123456

සටහන - පළමු_ ටේබල්, දෙවන_ටේබල්, තෙවන_ටේබල් සහ 123456 වැනි සමහර_ තීරුව යනු ආදර්ශන වගු නම්, තීරු නම් සහ අයි.ඩී. වලංගු නම් වලින් ඒවා ප්රතිස්ථාපනය කරන්න.


16

SQL සැබවින්ම අතේ ගෙන යා නොහැකි වීමට තවත් උදාහරණයක්.

MySQL සඳහා එය වනුයේ:

update ud, sale
set ud.assid = sale.assid
where sale.udid = ud.id;

වැඩි විස්තර සඳහා බහු වගු යාවත්කාලීන කියවන්න: http://dev.mysql.com/doc/refman/5.0/en/update.html

UPDATE [LOW_PRIORITY] [IGNORE] table_references
    SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
    [WHERE where_condition]

2
"SQL සැබවින්ම අතේ ගෙන යා නොහැක්කේ ඇයි" යන අදහස මත +1! අතේ ගෙන යා හැකි හැකියාව කෙතරම් බිඳෙනසුලු ද යත්, විචල්‍යයක් ප්‍රකාශ කිරීමෙන් බොහෝ ජනප්‍රිය දත්ත සමුදා එන්ජින් අතර අතේ ගෙන යා හැකි හැකියාව බිඳ වැටෙනු ඇත.
ජෙෆ් මොඩන්

9

ටෙරඩාටා ඇස්ටර් ඉලක්කය සපුරා ගන්නේ කෙසේද යන්න තවත් රසවත් ක්‍රමයක් ඉදිරිපත් කරයි:

MERGE INTO ud --what trable should be updated
USING sale -- from what table/relation update info should be taken
ON ud.id = sale.udid --join condition
WHEN MATCHED THEN 
    UPDATE SET ud.assid = sale.assid; -- how to update

8

මම හිතුවේ ඉහළ පෝස්ට් එකේ ඇති SQL-Server එක සයිබේස් සඳහා වැඩ කරයි, මන්ද ඒවා දෙකම T-SQL වන නමුත් අවාසනාවකට නොවේ.

සයිබේස් සඳහා යාවත්කාලීනය අන්වර්ථය නොව මේසය මත තිබිය යුතු බව මට පෙනී ගියේය:

update ud
set u.assid = s.assid
from ud u
    inner join sale s on
        u.id = s.udid

7

එක්වීමකින් පේළි කිහිපයක් යාවත්කාලීන කිරීමට FROM යතුරුපදය සමඟ පහත ප්‍රකාශය භාවිතා කරයි

UPDATE users 
set users.DivisionId=divisions.DivisionId
from divisions join users on divisions.Name=users.Division

7

MySQL

වගන්තිය අමතක වී සියලු කොන්දේසි ON ප්‍රකාශනයේ තැබුවහොත් ඔබට හොඳම කාර්ය සාධනය ලැබෙනු ඇත.

මම හිතන්නේ මෙය විමසුමට පළමුව වගු වලට සම්බන්ධ විය යුතු අතර පසුව එහි වගන්තිය ක්‍රියාත්මක වේ, එබැවින් ඔබට සම්බන්ධ වීමට අවශ්‍ය දේ අඩු කර ගත හැකි නම් එය ප්‍රති results ල ලබා ගැනීමට / udpate කිරීමට වේගවත්ම ක්‍රමයයි.

උදාහරණයක්

සිදුවීම

ඔබට පරිශීලකයින්ගේ වගුවක් ඇත. ඔවුන්ගේ පරිශීලක නාමය හෝ විද්‍යුත් තැපෑල හෝ ගිණුම් අංක භාවිතා කරමින් ඔවුන්ට ප්‍රවේශ විය හැකිය. මෙම ගිණුම් ක්‍රියාකාරී විය හැකිය (1) හෝ අක්‍රිය (0). මෙම වගුවේ පේළි 50000 ක් ඇත

එවිට ඔබට එකවර අක්‍රීය කිරීමට පරිශීලකයින්ගේ වගුවක් ඇත, මන්ද ඔවුන් සියල්ලන්ම නරක දෙයක් කර ඇති බව ඔබ සොයා ගන්නා බැවිනි. කෙසේ වෙතත්, මෙම වගුවේ පරිශීලක නාම, ඊමේල් සහ ගිණුම් අංක සමඟ එක් තීරුවක් ඇත. එය සතුව "has_run" දර්ශකයක් ඇති අතර එය ක්‍රියාත්මක වන විට 1 (සත්‍ය) ලෙස සැකසිය යුතුය

විමසුම

UPDATE users User
    INNER JOIN
        blacklist_users BlacklistUser
        ON
        (
            User.username = BlacklistUser.account_ref
            OR
            User.email = BlacklistedUser.account_ref
            OR
            User.phone_number = BlacklistUser.account_ref
            AND
            User.is_active = 1
            AND
            BlacklistUser.has_run = 0
        )
    SET
        User.is_active = 0,
        BlacklistUser.has_run = 1;

තර්කනය

අපට OR කොන්දේසි වලට සම්බන්ධ වීමට සිදුවුවහොත්, එය එක් එක් පේළියට සම්බන්ධ විය යුතුදැයි බැලීමට 4 වතාවක් පරීක්ෂා කර බැලිය යුතු අතර තවත් පේළි රාශියක් ආපසු ලබා දිය හැකිය. කෙසේ වෙතත්, එයට තවත් කොන්දේසි ලබා දීමෙන් එයට සම්බන්ධ වන විට සියලු කොන්දේසි සපුරා නොමැති නම් පේළි විශාල ප්‍රමාණයක් "මඟ හැරිය හැක".

පාරිතෝෂිකය

එය වඩාත් කියවිය හැකි ය. සියලුම කොන්දේසි එක තැනක වන අතර යාවත්කාලීන කළ යුතු පේළි එක තැනක තිබේ


4

සහ MS ACCESS හි:

UPDATE ud 
INNER JOIN sale ON ud.id = sale.udid
SET ud.assid = sale.assid;

1
අවවාදයක් ලෙස, රෙකෝඩ්සෙට් අර්ථ දැක්වීමෙන් පසු SET පැමිණිය යුතුය! ප්‍රවේශ දත්ත ගබඩාවක සමාන තත්වයක් සැකසීමට මම උත්සාහ කර ඇත්තෙමි, එයට WHERE වගන්තියක් අවශ්‍ය විය (එය වලංගු ON කොන්දේසියක් ලෙස පිළිගන්නේ නැත). සින්ටැක්ස් දෝෂ මඟහරවා ගැනීම සඳහා අවසාන වශයෙන් පැමිණිය යුතු තැන.
ඩොඩෙකැෆෝන්



3

මෙය උත්සාහ කරන්න, මෙය ඔබට ප්‍රයෝජනවත් වනු ඇතැයි මම සිතමි

update ud

set ud.assid = sale.assid

from ud 

Inner join sale on ud.id = sale.udid

where sale.udid is not null

2

SQLite සඳහා යාවත්කාලීන කිරීම සඳහා RowID දේපල භාවිතා කරන්න:

update Table set column = 'NewValue'
where RowID = 
(select t1.RowID from Table t1
join Table2 t2 on t1.JoinField = t2.JoinField
where t2.SelectValue = 'FooMyBarPlease');

1
ඔබට මෙය ටිකක් පැහැදිලි කළ හැකිද?
මොහොමඩ් නූරල්ඩින්

1
OMohammedNoureldin මම පැහැදිලි කිරීමට උත්සාහ කරමි. ගැටළුව වන්නේ එකම වගුවක් භාවිතා කරමින් එක්වීම පිළිබඳ විමසුමක ප්‍රති result ලයක් සමඟ වගුවක් යාවත්කාලීන කරන්නේ කෙසේද යන්නයි. (උප-තේරීම්) ප්‍රකාශය සම්බන්ධ වීමක් ලෙස ක්‍රියා කරන අතර පද්ධති ක්ෂේත්‍රයක් වන RowID නැවත ලබා දෙයි, එය වගුවක එක් එක් පේළිය සඳහා අද්විතීය අංකයකි. උප-තේරීමට පේළි කිහිපයක් ආපසු ලබා දිය හැකි බැවින්, “කොහේද RowID =” එහි ප්‍රති sub ලයක් ලෙස උප තේරීමෙන් තනි නිවැරදි පේළියක් තෝරාගෙන තීරුවට යාවත්කාලීන කරයි. ඔබට වැඩි පැහැදිලි කිරීමක් අවශ්‍ය නම් හෝ මෙම තේමාවේ වෙනසක් හඳුනා ගැනීමට අවශ්‍ය නම් මට දන්වන්න.
KeithTheBiped
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.