Soru SQL Server'da SELECT'ten nasıl geçilebilirim?


İçinde SQL Server, mümkün insert kullanarak bir tabloya SELECT Beyan:

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

O da mümkün mü güncelleştirme aracılığıyla SELECT? Değerleri içeren geçici bir tablo var ve bu değerleri kullanarak başka bir tabloyu güncellemek 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

3038
2018-02-25 14:36


Menşei


Andy'nin yorumu tamamen geçerli. Mysql web sitemi PDO'ya dönüştürdüm ve şu anda enjeksiyon saldırılarından bir şekilde güvenli olduğumu düşünüyorum. Sadece işlem sırasında, bazı sql ifadelerimin hala kullanıcı girişi kullanılarak yapıldığını fark ettim. Daha sonra hazırlanan ifadeleri kullanarak düzeltdim. Tam bir acemi için, pek çok uzman PDO kullanımı hakkında yorum yapmaktan vazgeçtiği, ancak t - Zafar Kurbonov


Cevaplar:


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'

4463
2018-02-25 14:39



Tablolar arasındaki bağlantıyı düzenliyorsanız (SET Table.other_table_id = @NewValue) sonra ON deyimini gibi bir şeye değiştirin ON Table.id = @IdToEdit AND other_table.id = @NewValue - Trisped
Bu eksik değil mi WHERE sorudaki yan tümce? Bunu test etmek için bu sistemde bir sunucum yok ama buna ekleyemezsiniz. ON sevmek: ON Table.id = other_table.id AND other_table.sql='cool'? Yoksa sorumu yanlış yorumlu muyum? - J V
Bu, INNER JOIN üzerinde yineleme yapmak için UPDATE kullanarak çalışır. ON, WHERE yan tümcesi ve INNER JOIN olarak çalışır, JOINed tablosunda bulunmayan kayıtları atlar. Bir WHERE yan tümcesi eklenmesi, JOINed tablosunun sonuç kümesini de sınırlar. @Roger Ray, MySQL'in hangi sürümünün ve sorgunuzun neydi? - fyrye
@RogerRay, bu soru Microsoft SQL Server hakkında. Ne yazık ki, çeşitli SQL uygulamaları arasındaki sözdizimi değişebilir. - Charles Wood
Bir şekilde ilgili olarak, genellikle UPDATE sorgularımı SELECT ifadeleri olarak yazmak istiyorum; böylece, yürütmeden önce güncellenecek verileri görebilirim. Sebastian, son zamanlarda yayınlanan bir blogda bunun için bir teknik sunuyor: sqlity.net/en/2867/update-from-select - dennislloydjr


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;

672
2017-09-09 09:40



MERGE "Upserting" kayıtları için de kullanılabilir; yani, UPDATE eşleşme kaydı varsa, INSERT eşleşme bulunmazsa yeni kayıt - brichins
Bu, benim için eşdeğer güncelleme ... katılma ifadesinden yaklaşık 10 kat daha hızlıydı. - Paul Suart
MERGE ayrıca DELETE için kullanılabilir. Ancak HEDEF tablosunun uzak bir masa olamayacağı için MERGE'ye dikkat edin. - Möoz
Birleştirme hataları: mssqltips.com/sqlservertip/3074/... - Simon D
@SimonD: herhangi bir SQL Server anahtar kelimesini seçin ve hataları bulacaksınız. Puanınız? Bahse girerim daha fazla hata (ve daha temel olanları) ile ilişkilidir UPDATE göre MERGEmillet, onlarla yaşamayı yeni öğrendiler ve manzaraya ('özellikler') dahil oldular. Blogların, UPDATE bloktaki yeni çocuktu. - onedaywhen


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

524
2018-01-22 17:47



Şimdiye kadar en basit! Ancak eksik olan İD iç SELECT alanından. WHERE yan tümcesinin çalışması için buna ihtiyacınız olacak - John Doherty
Bu, hemen hemen tüm DBMS'lerde çalışmaya eğilimlidir, bu da bir kez öğrenmek, her yerde yürütmek anlamına gelir. Bu, performanstan ziyade sizin için daha önemliyse, özellikle de bazı verilerinizi düzeltmek için güncellemeniz kapalıysa, bu cevabı tercih edebilirsiniz. - Alan Macdonald
@ dotnetN00b stackoverflow.com/a/2334741/206730 senin için iyi değil mi - Kiquenet


Ben değiştiririm Robin'in mükemmel cevabı aşağıdakilere

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
)

Bir WHERE yan tümcesi, etkilenmeye gerek olmayan satırları bile etkileyecektir, bu da (muhtemelen) indeks yeniden hesaplanmasına veya gerçekten tetiklenmemesi gereken yangın tetikleyicilerine neden olabilir.


253
2017-09-08 21:20



Bu sütunların hiçbiri nullable olduğunu varsayar. - Martin Smith
Haklısın, örneği elle yazıyordum. Bununla başa çıkmak için üçüncü ve dördüncü fıkraları ekledim. - quillbreaker
WHERE EXISTS(SELECT T1.Col1, T1.Col2 EXCEPT SELECT T2.Col1, T2.Col2)) daha özlüdür. - Martin Smith
Açıklamada bu iki maddeyi de içermemeli midir? (other_table.col1 boş ve table.col1 boş değil) veya (other_table.col2 boş ve table.col2 boş değil) - Barka
Hedefteki boş değerleri, null ile kaynağından değiştirmek isterseniz bağlıdır. Sık sık yapmıyorum. Ama eğer yaparsanız, Martin'in bulunduğu maddenin yapımı en iyi şeydir. - quillbreaker


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'

180
2018-02-25 14:41





Henüz belirtilmeyen bir başka olasılık sadece SELECT kendini bir CTE'ye bildirir ve CTE'yi günceller.

;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

Bu çalıştırmak için kolay bir yararı vardır SELECT kendi ilk aklı başına beyanı sonuçları kontrol edin, ancak kaynak ve hedef tablolarda aynı şekilde isimlendirildiyse, yukarıdaki sütunları yukarıdaki gibi takas etmenizi gerektirir.

Bu aynı zamanda tescilli ile aynı sınırlamaya sahiptir UPDATE ... FROM Diğer cevaplardan dördünde gösterilen sözdizimi. Kaynak tablo, bire-bir çok katılımın çok tarafında ise, o zaman olası eşleşen birleştirilmiş kayıtlardan hangisinin kullanılacağı belirsizdir. Update (bir sorun MERGE Aynı satırı bir kereden fazla güncellemeye yönelik bir girişim varsa, bir hatayı artırarak önler.


140
2017-11-06 00:18



ismin bir anlamı var mı CTE ? - Raptor
@ShivanRaptor - Bu kısaltmadır Ortak Tablo İfadesi. Sadece bu durumda keyfi bir takma ad. - Martin Smith
Bu aynı zamanda birden çok CTE ile de çalışır: ;WITH SomeCompexCTE AS (...), CTEAsAbove AS (SELECT T1.Col1,... FROM T1 JOIN SomeComplexCTE...) UPDATE CTEAsAbove SET Col1=_Col1, ... - VeeTheSecond


Kayıt için (ve benim gibi arama yapan başkaları), MySQL'de bunu şöyle yapabilirsin:

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

95
2017-10-05 14:20



Bu iyi çalıştı. Yukarıdaki sorguyu denedim, hepsi bir ya da başka bir çeşit hata veriyor.
Teşekkür ederim! Bunun eski olduğunu biliyorum, ama sadece bunun benim için çalıştığını söylemek istedim. Sunucum, FROM'UN bir UPDATE deyiminde kullanılmasına izin vermiyor. Bu nedenle, FROM yan tümcesini içeren tüm yanıtlar bir sözdizimi hatası verdi. Bu şekilde mükemmel çalıştı. Çok takdir edildi. - Todd Withers
Bu neden sık sık kışkırtılıyor? Birisi C # için sorarsa kayıt ruby ​​kodu için gönderirseniz aynı olurdu ... - isHuman
@ isHuman sql cevaplarımı ararken (ve tam tersi) bir sql-server sorusuna ulaşmak çok yaygındır. Bir c # sorusunda bir yakut cevabı yayınlamaktan tamamen farklıdır. - Gabriel


Takma ad kullanma:

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

78
2018-05-23 13:06





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

61
2017-11-14 13:17



Sizinki daha iyi biçimlendirilmiş; Ayrıca, bir alt seçerken, sizinki (ve Adrian) diğer formattan daha güvenilir çalışır. Cevabınızı gönderdiğiniz için teşekkürler. - Ben West
Bu SQl Server sözdizimi değil ve SQL sunucusunda çalışmayacak - HLGEM