SQL Server'da bir SELECT ├Â─česinden nas─▒l G├ťNCELLEME YAPAB─░L─░R─░M?


Al─▒nan cevaba git


Gelen SQL Server , bu m├╝mk├╝n insert bir kullanarak bir tabloya SELECT a├ž─▒klama:

 INSERT INTO Table (col1, col2, col3)
SELECT col1, col2, col3 
FROM other_table 
WHERE sql = 'cool'
 

O m├╝mk├╝n de mi g├╝ncelle┼čtirmek bir arac─▒l─▒─č─▒ SELECT ? De─čerleri i├žeren ge├žici bir tablom var ve bu de─čerleri kullanarak ba┼čka bir tablonun g├╝ncellenmesini istiyorum. Belki b├Âyle bir ┼čey:

 UPDATE Table SET col1, col2
SELECT col1, col2 
FROM other_table 
WHERE sql = 'cool'
WHERE Table.id = other_table.id
 

3505









Cevap say─▒s─▒n─▒ say: 30






 UPDATE
    Table_A
SET
    Table_A.col1 = Table_B.col1,
    Table_A.col2 = Table_B.col2
FROM
    Some_Table AS Table_A
    INNER JOIN Other_Table AS Table_B
        ON Table_A.id = Table_B.id
WHERE
    Table_A.col3 = 'cool'
 

5112







SQL Server 2008ÔÇÖde (veya daha iyisi), MERGE

 MERGE INTO YourTable T
   USING other_table S 
      ON T.id = S.id
         AND S.tsql = 'cool'
WHEN MATCHED THEN
   UPDATE 
      SET col1 = S.col1, 
          col2 = S.col2;
 

Alternatif:

 MERGE INTO YourTable T
   USING (
          SELECT id, col1, col2 
            FROM other_table 
           WHERE tsql = 'cool'
         ) S
      ON T.id = S.id
WHEN MATCHED THEN
   UPDATE 
      SET col1 = S.col1, 
          col2 = S.col2;
 

738







 UPDATE table 
SET Col1 = i.Col1, 
    Col2 = i.Col2 
FROM (
    SELECT ID, Col1, Col2 
    FROM other_table) i
WHERE 
    i.ID = table.ID
 

618







Robin'in a┼ča─č─▒dakilere verdi─či m├╝kemmel cevab─▒ de─či┼čtirirdim :

 UPDATE Table
SET Table.col1 = other_table.col1,
 Table.col2 = other_table.col2
FROM
    Table
INNER JOIN other_table ON Table.id = other_table.id
WHERE
    Table.col1 != other_table.col1
OR Table.col2 != other_table.col2
OR (
    other_table.col1 IS NOT NULL
    AND Table.col1 IS NULL
)
OR (
    other_table.col2 IS NOT NULL
    AND Table.col2 IS NULL
)
 

WHERE c├╝mlesi olmadan, etkilenmesi gerekmeyen sat─▒rlar─▒ bile etkileyeceksiniz, bu da (muhtemelen) ger├žekten ate┼členmemesi gereken endeks yeniden hesaplanmas─▒na veya yang─▒n tetiklemelerine neden olabilir.


272







Tek y├Ân

 UPDATE t 
SET t.col1 = o.col1, 
    t.col2 = o.col2
FROM 
    other_table o 
  JOIN 
    t ON t.id = o.id
WHERE 
    o.sql = 'cool'
 

195







Hen├╝z belirtilmeyen bir ba┼čka olas─▒l─▒k, SELECT ifadenin kendisini bir CTE'ye s─▒k─▒┼čt─▒r─▒p CTE'yi g├╝ncellemektir.

 ;WITH CTE
     AS (SELECT T1.Col1,
                T2.Col1 AS _Col1,
                T1.Col2,
                T2.Col2 AS _Col2
         FROM   T1
                JOIN T2
                  ON T1.id = T2.id
         /*Where clause added to exclude rows that are the same in both tables
           Handles NULL values correctly*/
         WHERE EXISTS(SELECT T1.Col1,
                             T1.Col2
                       EXCEPT
                       SELECT T2.Col1,
                              T2.Col2))
UPDATE CTE
SET    Col1 = _Col1,
       Col2 = _Col2
 

Bunun, SELECT sonu├žlar─▒ kontrol etmek i├žin ilk ├Ânce ifadeyi kendi ba┼č─▒na ├žal─▒┼čt─▒rman─▒n kolay olmas─▒ avantaj─▒na sahiptir , ancak kaynak ve hedef tablolar─▒nda ayn─▒ ┼čekilde adland─▒r─▒lm─▒┼člarsa, yukar─▒daki s├╝tunlar─▒ takma i┼člemini gerektirir.

Bu ayn─▒ zamanda UPDATE ... FROM di─čer cevaplar─▒n d├Ârd├╝nde g├Âsterilen ├Âzel s├Âzdizimi ile de ayn─▒ s─▒n─▒rlamaya sahiptir . E─čer kaynak tablo bire-├žok birle┼čtirmenin ├žok taraf─▒ndaysa, o zaman e┼čle┼čtirilen olas─▒ kay─▒tlardan hangisinin kullan─▒laca─č─▒ belirsizdir Update ( MERGE g├╝ncellemeyi denemek i├žin bir hatay─▒ y├╝kselterek ka├ž─▒nan bir sorun Ayn─▒ sat─▒rda bir defadan fazla).


154







Kay─▒t i├žin (ve benim gibi arama yapan di─čerleri i├žin), MySQL'de ┼č├Âyle yapabilirsiniz:

 UPDATE first_table, second_table
SET first_table.color = second_table.color
WHERE first_table.id = second_table.foreign_id
 

106







Takma ad─▒ kullanma:

 UPDATE t
   SET t.col1 = o.col1
  FROM table1 AS t
         INNER JOIN 
       table2 AS o 
         ON t.id = o.id
 

88







Bunu yapman─▒n basit yolu:

 UPDATE
    table_to_update,
    table_info
SET
    table_to_update.col1 = table_info.col1,
    table_to_update.col2 = table_info.col2

WHERE
    table_to_update.ID = table_info.ID
 

67







Bu, bir g├╝ncelleme yapmak i├žin ni┼č bir neden olabilir (├Ârne─čin, esas olarak bir prosed├╝rde kullan─▒l─▒r) veya ba┼čkalar─▒ i├žin a├ž─▒k olabilir, ancak birle┼čtirme kullanmadan g├╝ncelleme se├žme ifadesi ger├žekle┼čtirebilece─činiz de belirtilmelidir. aras─▒nda g├╝ncelleme yapt─▒─č─▒n─▒z tablolar─▒n ortak bir alan─▒ yoktur).

 update
    Table
set
    Table.example = a.value
from
    TableExample a
where
    Table.field = *key value* -- finds the row in Table 
    AND a.field = *key value* -- finds the row in TableExample a
 

55


2012-06-11





─░┼čte ba┼čka bir faydal─▒ s├Âzdizimi:

 UPDATE suppliers
SET supplier_name = (SELECT customers.name
                     FROM customers
                     WHERE customers.customer_id = suppliers.supplier_id)
WHERE EXISTS (SELECT customers.name
              FROM customers
              WHERE customers.customer_id = suppliers.supplier_id);
 

"NEREDE VAR" kullanarak null olup olmad─▒─č─▒n─▒ kontrol eder.


54







Bunu yaln─▒zca ekliyorum, b├Âylece g├╝ncellemeyi yapmadan ├Ânce nelerin g├╝ncellenece─čini kontrol edebilmeniz i├žin yazman─▒n h─▒zl─▒ bir yolunu g├Ârebilirsiniz.

 UPDATE Table 
SET  Table.col1 = other_table.col1,
     Table.col2 = other_table.col2 
--select Table.col1, other_table.col,Table.col2,other_table.col2, *   
FROM     Table 
INNER JOIN     other_table 
    ON     Table.id = other_table.id 
 

48







E─čer kullan─▒rsan─▒z MySQL yerine SQL Server, s├Âzdizimi ┼č├Âyledir:

 UPDATE Table1
INNER JOIN Table2
ON Table1.id = Table2.id
SET Table1.col1 = Table2.col1,
    Table1.col2 = Table2.col2
 

48







SQL veritaban─▒nda INNER JOIN ile SELECT g├╝ncellemesi

├çok fazla oy kullanan bu yaz─▒n─▒n ├žok fazla cevab─▒ oldu─ču i├žin ├Ânerimi burada da sunabilece─čimi d├╝┼č├╝nd├╝m. Her ne kadar soru ├žok ilgin├ž olsa da, pek ├žok forum sitesinde g├Ârd├╝m ve ekran g├Âr├╝nt├╝leriyle INNER JOIN kullanarak bir ├ž├Âz├╝m yapt─▒m .

─░lk ba┼čta, schoolold ad─▒nda bir tablo haz─▒rlad─▒m ve s├╝tun adlar─▒na g├Âre birka├ž kay─▒t ekledim ve uygulad─▒m .

Sonra eklenen kay─▒tlar─▒ g├Âr├╝nt├╝lemek i├žin SELECT komutunu ├žal─▒┼čt─▒rd─▒m .




Sonra da schoolnew ad─▒nda yeni bir masa haz─▒rlad─▒m ve benzer ┼čekilde bunun ├╝zerindeki eylemleri yapt─▒m.




Sonra, i├žine eklenen kay─▒tlar─▒ g├Âr├╝nt├╝lemek i├žin SELECT komutunu ├žal─▒┼čt─▒r─▒yorum.




┼×imdi, burada ├╝├ž├╝nc├╝ ve d├Ârd├╝nc├╝ s─▒rada baz─▒ de─či┼čiklikler yapmak istiyorum, bu i┼člemi tamamlamak i├žin INNER JOIN ile UPDATE komutunu ├žal─▒┼čt─▒r─▒yorum .




De─či┼čiklikleri g├Âr├╝nt├╝lemek i├žin SELECT komutunu uygular─▒m.




UPDATE deyimiyle INNER JOIN kullanarak ├╝├ž├╝nc├╝ ve d├Ârd├╝nc├╝ masa okul kay─▒tlar─▒n─▒n masa okullar─▒ ile kolayca nas─▒l de─či┼čtirildi─čini g├Ârebilirsiniz .


47







A┼ča─č─▒daki ├Ârnek, daha sonraki g├╝ncellemeler i├žin eski ve yeni de─čerleri d├Ând├╝rmek ├╝zere FROM yan t├╝mcesinden sonra bir SELECT ifadesi olarak t├╝retilmi┼č bir tablo kullan─▒r:

 UPDATE x
SET    x.col1 = x.newCol1,
       x.col2 = x.newCol2
FROM   (SELECT t.col1,
               t2.col1 AS newCol1,
               t.col2,
               t2.col2 AS newCol2
        FROM   [table] t
               JOIN other_table t2
                 ON t.ID = t2.ID) x
 

38







Ve e─čer masaya kendisiyle kat─▒lmak istersen (ki bu ├žok s─▒k olmaz):

 update t1                    -- just reference table alias here
set t1.somevalue = t2.somevalue
from table1 t1               -- these rows will be the targets
inner join table1 t2         -- these rows will be used as source
on ..................        -- the join clause is whatever suits you
 

38







Arac─▒l─▒─č─▒yla g├╝ncelleme CTE burada di─čer cevaplardan daha okunabilir:

 ;WITH cte
     AS (SELECT col1,col2,id
         FROM   other_table
         WHERE  sql = 'cool')
UPDATE A
SET    A.col1 = B.col1,
       A.col2 = B.col2
FROM   table A
       INNER JOIN cte B
               ON A.id = B.id
 

37







SQL Server kullan─▒yorsan─▒z, bir birle┼čim belirtmeden bir tabloyu di─čerinden g├╝ncelleyebilir ve ikisini de where yan t├╝mce ile ba─člayabilirsiniz . Bu ├žok daha basit bir SQL sorgusu yapar:

 UPDATE Table1
SET Table1.col1 = Table2.col1,
    Table1.col2 = Table2.col2
FROM
    Table2
WHERE
    Table1.id = Table2.id
 

35







Di─čer yol t├╝retilmi┼č bir tablo kullanmakt─▒r:

 UPDATE t
SET t.col1 = a.col1
    ,t.col2 = a.col2
FROM (
SELECT id, col1, col2 FROM @tbl2) a
INNER JOIN @tbl1 t ON t.id = a.id
 

├ľrnek veri

 DECLARE @tbl1 TABLE (id INT, col1 VARCHAR(10), col2 VARCHAR(10))
DECLARE @tbl2 TABLE (id INT, col1 VARCHAR(10), col2 VARCHAR(10))

INSERT @tbl1 SELECT 1, 'a', 'b' UNION SELECT 2, 'b', 'c'

INSERT @tbl2 SELECT 1, '1', '2' UNION SELECT 2, '3', '4'

UPDATE t
SET t.col1 = a.col1
    ,t.col2 = a.col2
FROM (
SELECT id, col1, col2 FROM @tbl2) a
INNER JOIN @tbl1 t ON t.id = a.id

SELECT * FROM @tbl1
SELECT * FROM @tbl2
 

21







 UPDATE TQ
SET TQ.IsProcessed = 1, TQ.TextName = 'bla bla bla'
FROM TableQueue TQ
INNER JOIN TableComment TC ON TC.ID = TQ.TCID
WHERE TQ.IsProcessed = 0
 

─░stedi─činizi g├╝ncelledi─činizden emin olmak i├žin ├Ânce

 SELECT TQ.IsProcessed, 1 AS NewValue1, TQ.TextName, 'bla bla bla' AS NewValue2
FROM TableQueue TQ
INNER JOIN TableComment TC ON TC.ID = TQ.TCID
WHERE TQ.IsProcessed = 0
 

21







Daha k─▒sa bir y├Ântem bile var ve sizin i├žin ┼ča┼č─▒rt─▒c─▒ olabilir:

├ľrnek veri seti:

 CREATE TABLE #SOURCE ([ID] INT, [Desc] VARCHAR(10));
CREATE TABLE #DEST   ([ID] INT, [Desc] VARCHAR(10));

INSERT INTO #SOURCE VALUES(1,'Desc_1'), (2, 'Desc_2'), (3, 'Desc_3');
INSERT INTO #DEST   VALUES(1,'Desc_4'), (2, 'Desc_5'), (3, 'Desc_6');
 

Kod:

 UPDATE #DEST
SET #DEST.[Desc] = #SOURCE.[Desc]
FROM #SOURCE
WHERE #DEST.[ID] = #SOURCE.[ID];
 

20







T├╝m farkl─▒ yakla┼č─▒mlar─▒ burada peki┼čtirmek.

  1. G├╝ncelleme se├ž
  2. Ortak bir tablo ifadesiyle g├╝ncelleme
  3. Birle┼čtirme

├ľrnek tablo yap─▒s─▒ a┼ča─č─▒dad─▒r ve Product_BAK'tan ├ťr├╝n tablosuna g├╝ncellenecektir.

├ťr├╝n

 CREATE TABLE [dbo].[Product](
    [Id] [int] IDENTITY(1, 1) NOT NULL,
    [Name] [nvarchar](100) NOT NULL,
    [Description] [nvarchar](100) NULL
) ON [PRIMARY]
 

Product_BAK

     CREATE TABLE [dbo].[Product_BAK](
        [Id] [int] IDENTITY(1, 1) NOT NULL,
        [Name] [nvarchar](100) NOT NULL,
        [Description] [nvarchar](100) NULL
    ) ON [PRIMARY]
 

1. G├╝ncellemeyi se├žin

     update P1
    set Name = P2.Name
    from Product P1
    inner join Product_Bak P2 on p1.id = P2.id
    where p1.id = 2
 

2. Ortak bir tablo ifadesiyle g├╝ncelleme

     ; With CTE as
    (
        select id, name from Product_Bak where id = 2
    )
    update P
    set Name = P2.name
    from  product P  inner join CTE P2 on P.id = P2.id
    where P2.id = 2
 

3. Birle┼čtirme

     Merge into product P1
    using Product_Bak P2 on P1.id = P2.id

    when matched then
    update set p1.[description] = p2.[description], p1.name = P2.Name;
 

Bu Birle┼čtirme deyiminde, hedefte e┼čle┼čen bir kay─▒t bulamazsan─▒z, ancak kaynakta var ise ve l├╝tfen s├Âzdizimini bulabilirsek i├žini koyabiliriz:

     Merge into product P1
    using Product_Bak P2 on P1.id = P2.id;

    when matched then
    update set p1.[description] = p2.[description], p1.name = P2.Name;

    WHEN NOT MATCHED THEN
    insert (name, description)
    values(p2.name, P2.description);
 

20







kullan─▒n:

 drop table uno
drop table dos

create table uno
(
    uid int,
    col1 char(1),
    col2 char(2)
)
create table dos
(
    did int,
    col1 char(1),
    col2 char(2),
    [sql] char(4)
)
insert into uno(uid) values (1)
insert into uno(uid) values (2)
insert into dos values (1,'a','b',null)
insert into dos values (2,'c','d','cool')

select * from uno 
select * from dos
 

YA:

 update uno set col1 = (select col1 from dos where uid = did and [sql]='cool'), 
col2 = (select col2 from dos where uid = did and [sql]='cool')
 

VEYA:

 update uno set col1=d.col1,col2=d.col2 from uno 
inner join dos d on uid=did where [sql]='cool'

select * from uno 
select * from dos
 

Kimlik s├╝tunu ad─▒ her iki tabloda da ayn─▒ysa, yaln─▒zca tablo ad─▒n─▒ g├╝ncelle┼čtirilecek tablonun ├Ân├╝ne koyun ve se├žilen tablo i├žin bir di─čer ad kullan─▒n.

 update uno set col1 = (select col1 from dos d where uno.[id] = d.[id] and [sql]='cool'),
col2  = (select col2 from dos d where uno.[id] = d.[id] and [sql]='cool')
 

19


2014-06-18





Kabul edilen cevapta:

 SET
Table_A.col1 = Table_B.col1,
Table_A.col2 = Table_B.col2
 

Ekleyece─čim:

 OUTPUT deleted.*, inserted.*
 

Genelde yapt─▒─č─▒m ┼čey her ┼čeyi geri d├Ân├╝┼čl├╝ bir i┼čleme koymak ve "OUTPUT" ┼čunlar─▒ kullanmak : bu ┼čekilde ger├žekle┼čmek ├╝zere olan her ┼čeyi g├Âr├╝yorum. Ben g├Ârd├╝klerimi memnunum, ben de─či┼čtirmek ROLLBACK INTO COMMIT .

Genelde yapt─▒─č─▒m ┼čeyi belgelemeye ihtiyac─▒m var, bu y├╝zden "results to Text" geri alma sorgusunu ├žal─▒┼čt─▒rd─▒─č─▒mda se├žene─či kullan─▒yorum ve hem beti─či hem de ├çIKI┼×LA sonucunu kaydetiyorum. (Tabii bu ├žok fazla sat─▒r de─či┼čtirirsem pratik de─čildir)


14







Bir select ifadesinden g├╝ncelleme yapman─▒n di─čer yolu:

 UPDATE A
SET A.col = A.col,B.col1 = B.col1
FROM  first_Table AS A
INNER JOIN second_Table AS B  ON A.id = B.id WHERE A.col2 = 'cool'
 

13







 UPDATE table AS a
INNER JOIN table2 AS b
ON a.col1 = b.col1
INNER JOIN ... AS ...
ON ... = ...
SET ...
WHERE ...
 

12







A┼ča─č─▒daki ├ž├Âz├╝m MySQL veritaban─▒ i├žin ├žal─▒┼čmaktad─▒r:

 UPDATE table1 a , table2 b 
SET a.columname = 'some value' 
WHERE b.columnname IS NULL ;
 

12







Se├ženek 1: ─░├ž birle┼čtirmeyi kullanma:

 UPDATE
    A
SET
    A.col1 = B.col1,
    A.col2 = B.col2
FROM
    Some_Table AS A
    INNER JOIN Other_Table AS B
        ON A.id = B.id
WHERE
    A.col3 = 'cool'
 

Se├ženek 2: E┼čli Alt sorgu

 UPDATE table 
SET Col1 = B.Col1, 
    Col2 = B.Col2 
FROM (
    SELECT ID, Col1, Col2 
    FROM other_table) B
WHERE 
    B.ID = table.ID
 

4







 declare @tblStudent table (id int,name varchar(300))
declare @tblMarks table (std_id int,std_name varchar(300),subject varchar(50),marks int)

insert into @tblStudent Values (1,'Abdul')
insert into @tblStudent Values(2,'Rahim')

insert into @tblMarks Values(1,'','Math',50)
insert into @tblMarks Values(1,'','History',40)
insert into @tblMarks Values(2,'','Math',30)
insert into @tblMarks Values(2,'','history',80)


select * from @tblMarks

update m
set m.std_name=s.name
 from @tblMarks as m
left join @tblStudent as s on s.id=m.std_id

select * from @tblMarks
 

2







 UPDATE table1
SET column1 = (SELECT expression1
               FROM table2
               WHERE conditions)
[WHERE conditions];
 

UPDATE deyiminin s├Âzdizimi, bir tabloyu ba┼čka bir tablodaki verilerle SQL Server'da g├╝ncellerken


2