Share via


BIRLEŞTIRME (Transact-SQL)

Ekleme, güncelleştirme veya bir kaynak tablo ile birleştirmek sonuçlarını temel alan bir hedef Tablo silme işlemlerini gerçekleştirir.Örneğin, iki tablo ekleme, güncelleştirme ya da diğer tabloda bulunan farklılıkları temel alan bir tablodaki satırları silmek eşitleyebilirsiniz.

Topic link iconTransact-SQL sözdizimi kuralları

[ WITH <common_table_expression> [,...n] ]
MERGE 
        [ TOP ( expression ) [ PERCENT ] ] 
        [ INTO ] <target_table> [ WITH ( <merge_hint> ) ] [ [ AS ] table_alias ]
        USING <table_source> 
        ON <merge_search_condition>
        [ WHEN MATCHED [ AND <clause_search_condition> ]
            THEN <merge_matched> ] [...n ]
        [ WHEN NOT MATCHED [ BY TARGET ] [ AND <clause_search_condition> ]
            THEN <merge_not_matched> ]
        [ WHEN NOT MATCHED BY SOURCE [ AND <clause_search_condition> ]
            THEN <merge_matched> ] [...n ]
        [ <output_clause> ]
        [ OPTION ( <query_hint> [ ,...n ] ) ]    
;

<target_table> ::=
{ 
    [ database_name . schema_name . | schema_name . ]
    target_table
}

<merge_hint>::=
{
    { [ <table_hint_limited> [ ,...n ] ]
    [ [ , ] INDEX ( index_val [ ,...n ] ) ] }
}

<table_source> ::= 
{
        table_or_view_name [ [ AS ] table_alias ] [ <tablesample_clause> ] 
            [ WITH ( table_hint [ [ , ]...n ] ) ] 
    | rowset_function [ [ AS ] table_alias ] 
            [ ( bulk_column_alias [ ,...n ] ) ] 
    | user_defined_function [ [ AS ] table_alias ]
    | OPENXML <openxml_clause> 
    | derived_table [ AS ] table_alias [ ( column_alias [ ,...n ] ) ] 
    | <joined_table> 
    | <pivoted_table> 
    | <unpivoted_table> 
}

<merge_search_condition> ::=
    <search_condition>

<merge_matched>::=
    { UPDATE SET <set_clause> | DELETE }

<set_clause>::=
SET
    { column_name = { expression | DEFAULT | NULL }
  | { udt_column_name.{ { property_name = expression
                                              | field_name = expression }
                                              | method_name ( argument [ ,...n ] ) }
     }
  | column_name { .WRITE ( expression , @Offset , @Length ) }
  | @variable = expression
  | @variable = column = expression
  | column_name { += | -= | *= | /= | %= | &= | ^= | |= } expression
  | @variable { += | -= | *= | /= | %= | &= | ^= | |= } expression
  | @variable = column { += | -= | *= | /= | %= | &= | ^= | |= } expression
  } [ ,...n ] 

<merge_not_matched>::=
{
        INSERT [ ( column_list ) ] 
            { VALUES ( values_list )
            | DEFAULT VALUES }
}

<clause_search_condition> ::=
    <search_condition>

<search condition> ::=
        { [ NOT ] <predicate> | ( <search_condition> ) } 
        [ { AND | OR } [ NOT ] { <predicate> | ( <search_condition> ) } ] 
[ ,...n ] 

<predicate> ::= 
    { expression { = | < > | ! = | > | > = | ! > | < | < = | ! < } expression 
    | string_expression [ NOT ] LIKE string_expression 
  [ ESCAPE 'escape_character' ] 
    | expression [ NOT ] BETWEEN expression AND expression 
    | expression IS [ NOT ] NULL 
    | CONTAINS 
    ( { column | * } , '< contains_search_condition >' ) 
    | FREETEXT ( { column | * } , 'freetext_string' ) 
    | expression [ NOT ] IN ( subquery | expression [ ,...n ] ) 
    | expression { = | < > | ! = | > | > = | ! > | < | < = | ! < } 
  { ALL | SOME | ANY} ( subquery ) 
    | EXISTS ( subquery ) } 

<output_clause>::=
{
        [ OUTPUT <dml_select_list> INTO { @table_variable | output_table }
            [ (column_list) ] ]
    [ OUTPUT <dml_select_list> ]
}

<dml_select_list>::=
        { <column_name> | scalar_expression } 
                [ [AS] column_alias_identifier ] [ ,...n ]

<column_name> ::=
        { DELETED | INSERTED | from_table_name } . { * | column_name }
      | $action

Bağımsız değişkenler

  • İLE > < common_table_expression
    Sonuç olarak adlandırılan geçici belirtir küme veya birleştirme ifadeinin kapsam içinde tanımlanan görünüm, genel tablo ifadesi olarak da bilinir.Sonuç kümesi, basit bir sorgudan elde edilen ve birleştirme deyim tarafından başvurulmaktadır.Daha fazla bilgi için bkz:WITH common_table_expression (Transact-SQL).

  • TOP ( expression) [PERCENT]
    Specifies the number or percentage of rows that are affected.expression can be either a number or a percentage of the rows.TOP ifadede başvurulan satırları herhangi bir sırada düzenlenirler.Daha fazla bilgi için bkz:TOP (Transact-SQL).

    Tablo tüm kaynak ve hedef tablonun birleştirilen sonra bir ekleme, güncelleştirme veya silme işlemi için geçerli olmayan birleştirilmiş satırlar silinir, TOP yan tümce uygulanır.TOP yan tümce daha birleştirilen satır sayısı belirtilen değere azaltır ve sýralanmamýþ bir biçimde birleştirilen kalan satırları ekleme, güncelleştirme ve silme eylemleri uygulanır.Diğer bir deyişle, hiçbir sipariş satırları, zaman yan tümcelerini tanımlanan eylemler arasında dağıtılır vardır.Örneğin, 10 satır TOP (10) etkiler; bu satırlar 7 güncelleştirilebilir ve 3 eklenen ya da 1 silinebilir belirterek, 5 güncelleştirildi, ve 4 vb. eklenir.

    Çünkü birleştirme deyim tam tablo taramayı gerçekleştiren birden çok toplu işlem oluşturarak büyük bir tabloyu değiştirmek için TOP yan tümce kullanarak kaynak ve hedef tablo g/Ç performansı etkilenir mi.Bu senaryoda, birbirini izleyen tüm toplu işleri yeni satırlar hedef olmak önemlidir.Daha fazla bilgi için bkz:BIRLEŞTIRME ekstresi performansı en iyi duruma getirme.

  • database_name
    Veritabanı adıtarget_tablebulunur.

  • schema_name
    Hangi şema adıtarget_tableait.

  • target_table
    Is the table or view against which the data rows from <table_source> are matched based on <clause_search_condition>.target_table is the target of any insert, update, or delete operations specified by the WHEN clauses of the MERGE statement.

    Iftarget_tablebir görünüm, karşı herhangi bir eylem görünümlerini güncelleştirmek için koşulları yinelenmeyeceğiDaha fazla bilgi için bkz:Bir görünümü kullanarak verileri değiştirme.

    target_table cannot be a remote table.target_table cannot have any rules defined on it.

  • [AS]table_alias
    İş için kullanılan bir diğer ad başvuru bir tablo.

  • < Table_source > kullanmayı
    Veri satırları ile eşleşen veri kaynağını belirtirtarget_tabletemel<merge_search durumu>.The result of this match dictates the actions to take by the WHEN clauses of the MERGE statement.<table_source> can be a remote table or a derived table that accesses remote tables.

    <table_source> can be a derived table that uses the Transact-SQLtable value constructor to construct a table by specifying multiple rows.

    Sözdizimi ve bu bağımsız değişkenleri hakkında daha fazla bilgi için yan tümce, bkz:Transact-SQL ().

  • < Merge_search_condition > ON
    Koşullar, belirtir.<table_source>birleştirilmiştarget_tableyerini belirlemek için eşleşen.

    Uyarı

    Yalnızca hedef sütunları belirtmek önemlidir tablo amacıyla eşleştirmek için kullanılır.Diğer bir deyişle, hedef tablonun kaynak tablo, karşılık gelen sütun karşılaştırılan sütunları belirtin.Değil denemek süzme yoluyla ON yan tümcesinde, hedef tablodaki satır dışında gibi belirterek sorgu performansını artırmak içinAND NOT target_table.column_x = value.Böylece, beklenmedik ve hatalı sonuçlar döndürebilir.

  • THEN eşleşen, < merge_matched >
    Belirleyen tüm satırlarıtarget_tabletarafından döndürülen satır uyan<table_source>ON<merge_search_condition>ve herhangi ek bir arama koşulu karşılayan, güncelleştirildi veya silindi göre<merge_matched>yan tümce.

    BİRLEŞTİRME deyim en fazla iki, eşleşen olabilir yan.İki yan belirtilmiş, daha sonra ilk yan gerekir birlikte bir AND ile<search_condition>yan tümce.Belirli bir satırın ikinci ilk ise, MATCHED yan tümce yalnızca UYGULANDIĞINDA.Varsa, eşleşen iki yan tümcesi ve bir UPDATE eylem belirtmeniz gerekir ve bir DELETE eylem belirtmeniz gerekir.İçinde belirtilen, UPDATE<merge_matched>yan tümce ve birden fazla satır<table_source>eşleşen bir satırtarget_tabletemel<merge_search_condition>,SQL Serversayı bir hata.BİRLEŞTİRME deyim olamaz birden çok kez aynı satırı güncelleştirir veya güncelleştirin ve aynı satırı silin.

  • EŞLEŞEN değil, [BY hedef] THEN merge_not_matched < >
    Bir satır eklendiğinde belirtirtarget_table tarafından verilen her satır için<table_source>ON<merge_search_condition>ile aynı değil bir satırdatarget_table, bir başka arama koşulu karşılayan, ancak geçerli.Eklemek için değeri tarafından belirtilen<merge_not_matched>yan tümce.BİRLEŞTİRME deyim yalnızca bir eşleşen değil, olabilir yan tümce.

  • BY eşleşen değil, THEN < merge_matched > kaynak
    Belirleyen tüm satırlarıtarget_tableeşleşmiyor tarafından döndürülen satır<table_source>ON<merge_search_condition>, ve, herhangi ek bir arama koşulu karşılayan, güncelleştirildi veya silindi göre<merge_matched>yan tümce.

    BİRLEŞTİRME deyim en fazla iki NOT eşleşen kaynak BY yan tümcesi, olabilir.İki yan belirtilmiş, daha sonra ilk yan gerekir birlikte bir AND ile<clause_search_condition>yan tümce.Belirli bir satır için ikinci WHEN BY eşleşen NOT kaynak yan tümce ilk değil, yalnızca uygulanır.Varsa iki NOT eşleşen kaynak BY yan tümceleri, sonra bir UPDATE eylem belirtmeniz gerekir ve bir DELETE eylem belirtmeniz gerekir.Yalnızca hedef sütun tablo içinde başvurulan<clause_search_condition>.

    Hiçbir satır geri tarafından<tablo _source>, kaynak sütunda tablo erişilemiyor.Belirtilen güncelleştirme veya silme işlemi,<merge_matched>yan kaynak sütun başvuruları tablo, hata 207 (geçersiz sütun adı) döndürülür.Örneğin, yan tümceWHEN NOT MATCHED BY SOURCE THEN UPDATE SET TargetTable.Col1 = SourceTable.Col1deyim için başarısız olmasına neden olabilirCol1Tablo veri kaynağına erişilemiyor.

  • VE < clause_search_condition >
    Tüm geçerli arama koşulu belirtir.Daha fazla bilgi için bkz:Arama koşulu (Transact-SQL).

  • <table_hint_limited>
    Hedef tablo üzerinde her ekleme, güncelleştirme veya birleştirme deyim ile gerçekleştirilen silme işlemleri için uygulanan bir veya daha fazla tablo ipuçlarını belirtir.WITH anahtar sözcüğünü ve ayraçlar gereklidir.

    NOLOCK ve READUNCOMMITTED izin verilmez.Tablo ipuçları hakkında daha fazla bilgi için bkz:Tablo ipuçları (Transact-SQL).

    İpucu TABLOCK belirten bir tablo olan hedefi olan bir INSERT deyim TABLOCKX İpucu belirtme aynı etkiye sahiptir.Özel bir kilit çekilen tablo.FORCESEEK belirtilmezse, hedef tablonun kaynak tablo ile birleştirilmiş örtülü örneğine uygulanır.

    Uyarı

    INSERT UNIQUE kısıtlamaları ihlal eden INSERT işlemleri sonucunda THEN [hedef] eşleşen değil, READPAST ile belirtme.

  • INDEX (index_val [,.. .n])
    Kapalı bir birleştirmek kaynak tablo ile gerçekleştirmek için hedef tablo adı veya bir veya daha fazla dizin kimliği belirtir.Daha fazla bilgi için bkz:Tablo ipuçları (Transact-SQL).

  • <output_clause>
    Her satır için bir satır döndürürtarget_tablegüncel, eklenen veya silinen, belirli bir siparişi yok.Bu bağımsız değişkenleri hakkında daha fazla bilgi için yan tümce, bkz:OUTPUT yan tümce (Transact-SQL).

  • SEÇENEK (< query_hint > [,.. .n])
    En iyi hale getirme ipuçları veritabanı motoru deyim biçimini özelleştirmek için kullanıldığını belirtir.Daha fazla bilgi için bkz:Sorgu ipuçları (Transact-SQL).

  • <merge_matched>
    Güncelleştirme veya silme işlemi tüm satırlara uygulanacak belirtirtarget_tableeşleşmiyor tarafından döndürülen satır<table_source>ON<merge_search_condition>, ve, gerçekleştirmek istediğiniz ek arama koşulu.

    • UPDATE küme < set_clause >
      Sütun veya hedef tablo ve bunları güncelleştirmek, değerleri için değişken adları listesini belirtir.

      Bu bağımsız değişkenleri hakkında daha fazla bilgi için yan tümce, bkz:UPDATE (Transact-SQL).sütun değeri bir değişken ayarını izin verilmez.

    • Sil
      Eşleşen satır satır belirtirtarget_tablesilinir.

  • <merge_not_matched>
    Hedef eklemek için değerleri belirtir tablo.

    • ( column_list )
      Hedef, bir veya birkaç sütun listesi mi tablo, veri eklemek.Columns must be specified as a single-part name or else the MERGE statement will fail.column_list must be enclosed in parentheses and delimited by commas.

    • VALUES ( values_list)
      Sabitler, değişkenler veya ifadeler hedef tabloya eklemek için değerleri virgülle ayrılmış listesi belirtilir.yürütmek deyim deyimleri içeremez.

    • VARSAYILAN DEĞERLER
      Zorlar, her sütun için varsayılan değerleri içermek üzere eklenen satıra tanımlanır.

    Bu yan hakkında daha fazla bilgi için bkz:INSERT (Transact-SQL).

  • <arama koşulu>
    Arama koşullarını belirtmek için kullanılan belirtir<merge_search_condition>or<clause_search_condition>.Bu bağımsız değişkenleri hakkında daha fazla bilgi için yan tümce, bkz:Arama koşulu (Transact-SQL).

Remarks

Üç MATCHED yan tümceleri en az birinin belirtilmesi gerekir, ancak herhangi bir sırada belirtilebilir.Bir değişkeni birden çok kez aynı MATCHED yan tümcesinde güncelleştirilemiyor.

Tüm ekleme, güncelleştirme veya silme eylemleri belirtilen hedef tablo ile birleştirme ifadesi sınırlı üzerinde tanımlanmış basamaklı bir tutarlılığı kısıtlamaları da dahil olmak üzere tüm kısıtlamaları.IGNORE_DUP_KEY ise küme ON için hedef tablo üzerinde herhangi benzersiz dizinleri birleştirme bu küme ting yoksayar.

BİRLEŞTİRME ifadesi bir noktalı virgül (;) gerektiren bir deyim Sonlandırıcı olarak.BİRLEŞTİRME sırasında hata 10713 geçirilen deyim Sonlandırıcı çalıştırılır.

Mektup Birleştirme sonra kullanıldığında@@ ROWCOUNT (Transact-SQL)eklenen, güncelleştirilen ve silinen istemci. satır sayısını verir

Veritabanı uyumluluk düzey 100 olarak ayarlandığında birleştirme tam olarak ayrılmış bir anahtar sözcüktür.BİRLEŞTİRME deyim altında veritabanı uyumluluk düzey 90 ile 100 kullanılabilir; veritabanı uyumluluk düzey 90 olarak küme, ancak anahtar sözcüğü tam olarak ayrılmış değil.

Tetikleyici uygulama

Her ekleme, güncelleştirme veya silme BİRLEŞTİRMEDE belirtilen eylemi deyim,SQL Servertüm ilgili hedef tablo üzerinde tanımlı Tetikleyiciler sonra harekete ancak garanti etmez, hangi eylem için tetikleyici harekete ilk veya son.Aynı işlemi için tanımlı Tetikleyiciler belirttiğiniz sırada korur.Tetikleme sırasıyla tetikleyici ayarı hakkında daha fazla bilgi için bkz:Ilk ve son Tetikleyicileri belirtme.

Hedef Tablo etkin bir INSTEAD OF tetikleyicisi bir ekleme için tanımlanmış, güncelleştirin veya bir birleştirme deyim ile gerçekleştirilen eylem, etkin bir birleştirme deyiminde belirtilen eylem için tetikleyici INSTEAD OF olmalıdır sonra silme.

Vardır herhangi bir INSTEAD OF UPDATE ya da INSTEAD OF DELETE üzerinde tanımlı Tetikleyicilertarget_table, güncelleştirme veya silme işlemleri gerçekleştirilemiyor.Yerine, Tetikleyiciler yangın veinsertedvedeletedTablolar buna uygun olarak doldurulur.

Vardır bir INSTEAD OF INSERT tetikleyicilerini tanımlıtarget_table, ekleme işlemi yapılmaz.Yerine, Tetikleyiciler yangın veinsertedtablo buna uygun olarak doldurulur.

İzinler

SELECT izni kaynak tablo ve INSERT, UPDATE veya DELETE hedef tablo izinleri gerektirir.İzinler bölümünde ek bilgi için bkz:SELECT, INSERT, UPDATE, and DELETE topics.

Örnekler

C.Tek bir deyimde Tablo Ekle ve güncelleştir işlemleri gerçekleştirmek için mektup BİRLEŞTİRMEYİ kullanarak

Ortak bir senaryoda, bir veya daha fazla sütunda güncelleştiriyor bir tablo eşleşen bir satır varsa, eşleşen bir satır yoksa yeni bir satıra veri ekleme veya.Bu genellikle uygun UPDATE ve INSERT deyimleri içeren bir saklı yordam parametreleri aktararak yapılır.BİRLEŞTİRME deyim ile tek bir deyimde iki görevleri gerçekleştirebilirsiniz.INSERT deyim ve bir UPDATE deyim içeren bir saklı yordam aşağıdaki örnekte gösterilmiştir.Yordamı daha sonra tek bir birleştirme deyim kullanarak eşdeğer işlemleri gerçekleştirmek için değiştirilir.

B.UPDATE gerçekleştirmek için mektup BİRLEŞTİRMEYİ kullanarak ve işlemleri tek bir deyim, tablo DELETE

Güncelleştirmek için birleştirme aşağıdaki örnekte kullanırProductInventory, tabloAdventureWorksişlenir siparişlerine göre günlük olarak, örnek veritabanıSalesOrderDetailTablo.The Quantity column of the ProductInventory table is updated by subtracting the number of orders placed each day for each product in the SalesOrderDetail table.Ürün sayısı 0 Ürün düzey veya daha az stok düşerse, bu ürünün satır silinirProductInventoryTablo.

C.UPDATE gerçekleştirmek için mektup BİRLEŞTİRMEYİ kullanarak ve bir türetilmiş bir kaynak tabloyu kullanarak bir hedef tabloda INSERT işlemi

Değiştirmek için birleştirme aşağıdaki örnekte kullananSalesReasonTablo güncelleştirme veya ekleme satırı., DeğeriNewNameveri kaynağında tabloyu bir değere uyanNamehedef tablonun sütun ( SalesReason),ReasonTypesütun güncelleştirildiği hedef tablo., DeğeriNewNamemu değil eşleme, kaynak satır eklendiğinde hedef tablo.Kaynak tablo kullanan bir türetilmiş tablodurTransact-SQLTablo değeri Oluşturucu için birden çok satır kaynak tablosu.Türetilen tablonun Tablo değeri Kurucuda kullanma hakkında daha fazla bilgi için bkz:Tablo değeri yapıcı.Örnek de nasıl depolanacağı gösterir sonuçlar OUTPUT yan tümcesinin bir tablo değişkeni ve sonra özetlemek sonuçlar basit seçin eklenen ve güncelleştirilen satır sayısını verir işlemi gerçekleştirmek ile birleştirme statment.

D.Başka bir birleştirme deyiminin sonuçlarını ekleme tablo

Aşağıdaki örnek, bir birleştirme deyim OUTPUT yan tümce döndürülen verileri yakalar ve başka bir veri ekler tablo.Birleştirme deyim güncelleştirmeleriQuantitysütunProductInventoryişlenir siparişlerine göre tablo,SalesOrderDetailTablo.Örnek güncelleştirilir ve başka ekler satır yakalayan tablo stok değişiklikleri izlemek için kullanılır.

Diğer örnekler için başvurunEkleme, güncelleştirme ve BIRLEŞTIRME kullanarak veri silmeveBIRLEŞTIRME ekstresi performansı en iyi duruma getirme.