Bagikan melalui


Klausul FROM dan JOIN, APPLY, PIVOT (Transact-SQL)

Berlaku untuk: Titik akhir analitik SQL Server 2016 (13.x) dan yang lebih baru azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Platform System (PDW) di Microsoft Fabric Warehouse di Microsoft Fabric

Dalam Transact-SQL, klausul FROM tersedia pada pernyataan berikut:

Klausa FROM biasanya diperlukan pada pernyataan SELECT. Pengecualiannya adalah ketika tidak ada kolom tabel yang tercantum, dan satu-satunya item yang tercantum adalah literal atau variabel atau ekspresi aritmatika.

Artikel ini juga membahas kata kunci berikut yang dapat digunakan pada klausa FROM:

Konvensi sintaks transact-SQL

Sintaks

Sintaks untuk SQL Server dan Azure SQL Database:

[ FROM { <table_source> } [ , ...n ] ]
<table_source> ::=
{
    table_or_view_name [ FOR SYSTEM_TIME <system_time> ] [ [ 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>
    | @variable [ [ AS ] table_alias ]
    | @variable.function_call ( expression [ , ...n ] )
        [ [ AS ] table_alias ] [ (column_alias [ , ...n ] ) ]
}
<tablesample_clause> ::=
    TABLESAMPLE [ SYSTEM ] ( sample_number [ PERCENT | ROWS ] )
        [ REPEATABLE ( repeat_seed ) ]

<joined_table> ::=
{
    <table_source> <join_type> <table_source> ON <search_condition>
    | <table_source> CROSS JOIN <table_source>
    | left_table_source { CROSS | OUTER } APPLY right_table_source
    | [ ( ] <joined_table> [ ) ]
}
<join_type> ::=
    [ { INNER | { { LEFT | RIGHT | FULL } [ OUTER ] } } [ <join_hint> ] ]
    JOIN

<pivoted_table> ::=
    table_source PIVOT <pivot_clause> [ [ AS ] table_alias ]

<pivot_clause> ::=
        ( aggregate_function ( value_column [ [ , ] ...n ] )
        FOR pivot_column
        IN ( <column_list> )
    )

<unpivoted_table> ::=
    table_source UNPIVOT <unpivot_clause> [ [ AS ] table_alias ]

<unpivot_clause> ::=
    ( value_column FOR pivot_column IN ( <column_list> ) )

<column_list> ::=
    column_name [ , ...n ]

<system_time> ::=
{
      AS OF <date_time>
    | FROM <start_date_time> TO <end_date_time>
    | BETWEEN <start_date_time> AND <end_date_time>
    | CONTAINED IN (<start_date_time> , <end_date_time>)
    | ALL
}

    <date_time>::=
        <date_time_literal> | @date_time_variable

    <start_date_time>::=
        <date_time_literal> | @date_time_variable

    <end_date_time>::=
        <date_time_literal> | @date_time_variable

Sintaks untuk Gudang Data Paralel, Azure Synapse Analytics:

FROM { <table_source> [ , ...n ] }

<table_source> ::=
{
    [ database_name . [ schema_name ] . | schema_name . ] table_or_view_name [ AS ] table_or_view_alias
    [ <tablesample_clause> ]
    | derived_table [ AS ] table_alias [ ( column_alias [ , ...n ] ) ]
    | <joined_table>
}

<tablesample_clause> ::=
    TABLESAMPLE ( sample_number [ PERCENT ] ) -- Azure Synapse Analytics Dedicated SQL pool only

<joined_table> ::=
{
    <table_source> <join_type> <table_source> ON search_condition
    | <table_source> CROSS JOIN <table_source>
    | left_table_source { CROSS | OUTER } APPLY right_table_source
    | [ ( ] <joined_table> [ ) ]
}

<join_type> ::=
    [ INNER ] [ <join hint> ] JOIN
    | LEFT  [ OUTER ] JOIN
    | RIGHT [ OUTER ] JOIN
    | FULL  [ OUTER ] JOIN

<join_hint> ::=
    REDUCE
    | REPLICATE
    | REDISTRIBUTE

Sintaks untuk Microsoft Fabric:

FROM { <table_source> [ , ...n ] }

<table_source> ::=
{
    [ database_name . [ schema_name ] . | schema_name . ] table_or_view_name [ AS ] table_or_view_alias
    | derived_table [ AS ] table_alias [ ( column_alias [ , ...n ] ) ]
    | <joined_table>
}

<joined_table> ::=
{
    <table_source> <join_type> <table_source> ON search_condition
    | <table_source> CROSS JOIN <table_source>
    | left_table_source { CROSS | OUTER } APPLY right_table_source
    | [ ( ] <joined_table> [ ) ]
}

<join_type> ::=
    [ INNER ] [ <join hint> ] JOIN
    | LEFT  [ OUTER ] JOIN
    | RIGHT [ OUTER ] JOIN
    | FULL  [ OUTER ] JOIN

<join_hint> ::=
    REDUCE
    | REPLICATE
    | REDISTRIBUTE

Argumen

<table_source>

Menentukan tabel, tampilan, variabel tabel, atau sumber tabel turunan, dengan atau tanpa alias, untuk digunakan dalam pernyataan Transact-SQL. Hingga 256 sumber tabel dapat digunakan dalam pernyataan, meskipun batasnya bervariasi tergantung pada memori yang tersedia dan kompleksitas ekspresi lain dalam kueri. Kueri individual mungkin tidak mendukung hingga 256 sumber tabel.

Catatan

Performa kueri mungkin menderita banyak tabel yang dirujuk dalam kueri. Waktu kompilasi dan pengoptimalan juga dipengaruhi oleh faktor tambahan. Ini termasuk keberadaan indeks dan tampilan terindeks pada setiap <table_source> dan ukuran <select_list> dalam pernyataan SELECT.

Urutan sumber tabel setelah kata kunci FROM tidak memengaruhi tataan hasil yang dikembalikan. SQL Server mengembalikan kesalahan saat nama duplikat muncul dalam klausa FROM.

table_or_view_name

Nama tabel atau tampilan.

Jika tabel atau tampilan ada di database lain pada instans SQL Server yang sama, gunakan nama yang sepenuhnya memenuhi syarat dalam database formulir.skema.object_name.

Jika tabel atau tampilan ada di luar instans SQL Serverl, gunakan nama empat bagian dalam formulir linked_server.katalog.skema.objek. Untuk informasi selengkapnya, lihat sp_addlinkedserver (Transact-SQL). Nama empat bagian yang dibangun dengan menggunakan fungsi OPENDATASOURCE sebagai bagian server dari nama juga dapat digunakan untuk menentukan sumber tabel jarak jauh. Ketika OPENDATASOURCE ditentukan, database_name dan schema_name mungkin tidak berlaku untuk semua sumber data dan tunduk pada kemampuan penyedia OLE DB yang mengakses objek jarak jauh.

[AS] table_alias

Alias untuk table_source yang dapat digunakan baik untuk kenyamanan atau untuk membedakan tabel atau tampilan dalam gabungan atau subkueri mandiri. Alias sering kali merupakan nama tabel yang dipersingkat yang digunakan untuk merujuk ke kolom tabel tertentu dalam gabungan. Jika nama kolom yang sama ada di lebih dari satu tabel dalam gabungan, SQL Server mungkin mengharuskan nama kolom memenuhi syarat dengan nama tabel, nama tampilan, atau alias untuk membedakan kolom ini. Nama tabel tidak dapat digunakan jika alias ditentukan.

Saat tabel turunan, set baris, atau fungsi bernilai tabel, atau klausa operator (seperti PIVOT atau UNPIVOT) digunakan, table_alias yang diperlukan di akhir klausa adalah nama tabel terkait untuk semua kolom, termasuk kolom pengelompokan, dikembalikan.

WITH (<table_hint> )

Menentukan bahwa pengoptimal kueri menggunakan pengoptimalan atau strategi penguncian dengan tabel ini dan untuk pernyataan ini. Untuk informasi selengkapnya, lihat Petunjuk Tabel (Transact-SQL).

rowset_function

Berlaku untuk: SQL Server dan SQL Database.

Menentukan salah satu fungsi set baris, seperti OPENROWSET, yang mengembalikan objek yang dapat digunakan alih-alih referensi tabel. Untuk informasi selengkapnya tentang daftar fungsi set baris, lihat Fungsi Set Baris (Transact-SQL).

Menggunakan fungsi OPENROWSET dan OPENQUERY untuk menentukan objek jarak jauh tergantung pada kemampuan penyedia OLE DB yang mengakses objek.

bulk_column_alias

Berlaku untuk: SQL Server dan SQL Database.

Alias opsional untuk mengganti nama kolom dalam tataan hasil. Alias kolom hanya diperbolehkan dalam pernyataan SELECT yang menggunakan fungsi OPENROWSET dengan opsi MASSAL. Saat Anda menggunakan bulk_column_alias, tentukan alias untuk setiap kolom tabel dalam urutan yang sama dengan kolom dalam file.

Catatan

Alias ini mengambil alih atribut NAME dalam elemen KOLOM file format XML, jika ada.

user_defined_function

Menentukan fungsi bernilai tabel.

openxml_clause OPENXML <>

Berlaku untuk: SQL Server dan SQL Database.

Menyediakan tampilan set baris di atas dokumen XML. Untuk informasi selengkapnya, lihat OPENXML (Transact-SQL).

derived_table

Subkueri yang mengambil baris dari database. derived_table digunakan sebagai input ke kueri luar.

derived_table dapat menggunakan fitur konstruktor nilai tabel Transact-SQL untuk menentukan beberapa baris. Contohnya,SELECT * FROM (VALUES (1, 2), (3, 4), (5, 6), (7, 8), (9, 10) ) AS MyTable(a, b);. Untuk informasi selengkapnya, lihat Konstruktor Nilai Tabel (Transact-SQL).

column_alias

Alias opsional untuk mengganti nama kolom dalam kumpulan hasil tabel turunan. Sertakan satu alias kolom untuk setiap kolom dalam daftar pilih, dan sertakan daftar lengkap alias kolom dalam tanda kurung.

table_or_view_name UNTUK system_time SYSTEM_TIME <>

Berlaku untuk: SQL Server 2016 (13.x) dan versi yang lebih baru, dan SQL Database.

Menentukan bahwa versi data tertentu dikembalikan dari tabel temporal yang ditentukan dan tabel riwayat versi sistem yang ditautkan

Klausul TABLESAMPLE

Berlaku untuk: SQL Server, SQL Database, dan kumpulan SQL khusus Azure Synapse Analytics

Menentukan bahwa sampel data dari tabel dikembalikan. Sampel mungkin perkiraan. Klausa ini dapat digunakan pada tabel utama atau gabungan apa pun dalam pernyataan SELECT atau UPDATE. TABLESAMPLE tidak dapat ditentukan dengan tampilan.

Catatan

Saat Anda menggunakan TABLESAMPLE terhadap database yang ditingkatkan ke SQL Server, tingkat kompatibilitas database diatur ke 110 atau lebih tinggi, PIVOT tidak diizinkan dalam kueri ekspresi tabel umum (CTE) rekursif. Untuk informasi selengkapnya, lihat MENGUBAH Tingkat Kompatibilitas DATABASE (Transact-SQL).

SISTEM

Metode pengambilan sampel dependen implementasi yang ditentukan oleh standar ISO. Di SQL Server, ini adalah satu-satunya metode pengambilan sampel yang tersedia dan diterapkan secara default. SYSTEM menerapkan metode pengambilan sampel berbasis halaman di mana sekumpulan halaman acak dari tabel dipilih untuk sampel, dan semua baris pada halaman tersebut dikembalikan sebagai subset sampel.

sample_number

Ekspresi numerik yang tepat atau perkiraan konstanta yang mewakili persen atau jumlah baris. Ketika ditentukan dengan PERCENT, sample_number secara implisit dikonversi ke nilai float ; jika tidak, itu dikonversi ke bigint. PERCENT adalah default.

PERCENT

Menentukan bahwa sample_number persen dari baris tabel harus diambil dari tabel. Ketika PERCENT ditentukan, SQL Server mengembalikan perkiraan persentase yang ditentukan. Ketika PERCENT ditentukan , ekspresi sample_number harus dievaluasi ke nilai dari 0 hingga 100.

ROWS

Menentukan bahwa sekitar sample_number baris diambil. Ketika ROWS ditentukan, SQL Server mengembalikan perkiraan jumlah baris yang ditentukan. Saat ROWS ditentukan, ekspresi sample_number harus mengevaluasi ke nilai bilangan bulat yang lebih besar dari nol.

BERULANG

Menunjukkan bahwa sampel yang dipilih dapat dikembalikan lagi. Ketika ditentukan dengan nilai repeat_seed yang sama, SQL Server mengembalikan subset baris yang sama selama tidak ada perubahan yang dilakukan pada baris apa pun dalam tabel. Ketika ditentukan dengan nilai repeat_seed yang berbeda, SQL Server kemungkinan akan mengembalikan beberapa sampel baris yang berbeda dalam tabel. Tindakan berikut pada tabel dianggap sebagai perubahan: menyisipkan, memperbarui, menghapus, membangun kembali indeks atau defragmentasi, dan pemulihan atau lampirkan database.

repeat_seed

Ekspresi bilangan bulat konstan yang digunakan oleh SQL Server untuk menghasilkan angka acak. repeat_seed besar. Jika repeat_seed tidak ditentukan, SQL Server menetapkan nilai secara acak. Untuk nilai repeat_seed tertentu, hasil pengambilan sampel selalu sama jika tidak ada perubahan yang diterapkan ke tabel. Ekspresi repeat_seed harus mengevaluasi ke bilangan bulat yang lebih besar dari nol.

Tabel yang digabungkan

Tabel yang digabungkan adalah kumpulan hasil yang merupakan produk dari dua tabel atau lebih. Untuk beberapa gabungan, gunakan tanda kurung untuk mengubah urutan alami gabungan.

Jenis gabungan

Menentukan jenis operasi gabungan.

INNER

Menentukan semua pasangan baris yang cocok dikembalikan. Membuang baris yang tidak cocok dari kedua tabel. Ketika tidak ada jenis gabungan yang ditentukan, ini adalah default.

PENUH [ LUAR ]

Menentukan bahwa baris dari tabel kiri atau kanan yang tidak memenuhi kondisi gabungan disertakan dalam kumpulan hasil, dan kolom output yang sesuai dengan tabel lain diatur ke NULL. Ini selain semua baris yang biasanya dikembalikan oleh INNER JOIN.

KIRI [ LUAR ]

Menentukan bahwa semua baris dari tabel kiri yang tidak memenuhi kondisi gabungan disertakan dalam kumpulan hasil, dan kolom output dari tabel lain diatur ke NULL selain semua baris yang dikembalikan oleh gabungan dalam.

KANAN [ LUAR ]

Menentukan semua baris dari tabel kanan yang tidak memenuhi kondisi gabungan disertakan dalam kumpulan hasil, dan kolom output yang sesuai dengan tabel lain diatur ke NULL, selain semua baris yang dikembalikan oleh gabungan dalam.

Petunjuk gabungan

Untuk SQL Server dan SQL Database, menentukan bahwa pengoptimal kueri SQL Server menggunakan satu petunjuk gabungan, atau algoritma eksekusi, per gabungan yang ditentukan dalam klausa FROM kueri. Untuk informasi selengkapnya, lihat Menggabungkan Petunjuk (Transact-SQL).

Untuk Azure Synapse Analytics dan Analytics Platform System (PDW), petunjuk gabungan ini berlaku untuk gabungan INNER pada dua kolom distribusi yang tidak kompatibel. Mereka dapat meningkatkan performa kueri dengan membatasi jumlah pergerakan data yang terjadi selama pemrosesan kueri. Petunjuk gabungan yang diizinkan untuk Azure Synapse Analytics dan Analytics Platform System (PDW) adalah sebagai berikut:

KURANGI

Mengurangi jumlah baris yang akan dipindahkan untuk tabel di sisi kanan gabungan agar kompatibel dengan dua tabel distribusi yang tidak kompatibel. Petunjuk REDUCE juga disebut petunjuk semi-gabungan.

REPLICATE

Menyebabkan nilai dalam kolom gabungan dari tabel di sisi kanan gabungan direplikasi ke semua simpul. Tabel di sebelah kiri digabungkan ke versi kolom tersebut yang direplikasi.

MENDISTRIBUSIKAN

Memaksa dua sumber data didistribusikan pada kolom yang ditentukan dalam klausa JOIN. Untuk tabel terdistribusi, Analytics Platform System (PDW) melakukan pemindahan acak. Untuk tabel yang direplikasi, Analytics Platform System (PDW) melakukan pemangkasan pemindahan. Untuk memahami jenis pemindahan ini, lihat bagian "Operasi Rencana Kueri DMS" di artikel "Memahami Rencana Kueri" di dokumentasi produk Sistem Platform Analitik (PDW). Petunjuk ini dapat meningkatkan performa saat rencana kueri menggunakan pemindahan siaran untuk menyelesaikan gabungan distribusi yang tidak kompatibel.

IKUTI

Menunjukkan bahwa operasi gabungan yang ditentukan harus terjadi antara sumber tabel atau tampilan yang ditentukan.

ON <search_condition>

Menentukan kondisi di mana gabungan didasarkan. Kondisi ini dapat menentukan predikat apa pun, meskipun operator kolom dan perbandingan sering digunakan, misalnya:

SELECT p.ProductID,
    v.BusinessEntityID
FROM Production.Product AS p
INNER JOIN Purchasing.ProductVendor AS v
    ON (p.ProductID = v.ProductID);

Saat kondisi menentukan kolom, kolom tidak harus memiliki nama yang sama atau jenis data yang sama; namun, jika jenis data tidak sama, jenis data harus kompatibel atau jenis yang dapat dikonversi secara implisit oleh SQL Server. Jika jenis data tidak dapat dikonversi secara implisit, kondisi harus secara eksplisit mengonversi jenis data dengan menggunakan fungsi CONVERT.

Mungkin ada predikat yang hanya melibatkan salah satu tabel yang digabungkan dalam klausul ON. Predikat tersebut juga dapat berada dalam klausa WHERE dalam kueri. Meskipun penempatan predikat tersebut tidak membuat perbedaan untuk gabungan INNER, mereka dapat menyebabkan hasil yang berbeda ketika gabungan OUTER terlibat. Ini karena predikat dalam klausul ON diterapkan ke tabel sebelum gabungan, sedangkan klausul WHERE diterapkan secara semantik ke hasil gabungan.

Untuk informasi selengkapnya tentang kondisi dan predikat pencarian, lihat Kondisi Pencarian (Transact-SQL).

CROSS JOIN

Menentukan produk silang dari dua tabel. Mengembalikan baris yang sama seolah-olah tidak ada klausa WHERE yang ditentukan dalam gabungan gaya lama non-SQL-92.

left_table_source { CROSS | OUTER } TERAPKAN right_table_source

Menentukan bahwa right_table_source operator APPLY dievaluasi terhadap setiap baris left_table_source. Fungsionalitas ini berguna ketika right_table_source berisi fungsi bernilai tabel yang mengambil nilai kolom dari left_table_source sebagai salah satu argumennya.

Cross atau OUTER harus ditentukan dengan APPLY. Saat CROSS ditentukan, tidak ada baris yang dihasilkan saat right_table_source dievaluasi terhadap baris left_table_source yang ditentukan dan mengembalikan tataan hasil kosong.

Saat OUTER ditentukan, satu baris diproduksi untuk setiap baris left_table_source bahkan ketika right_table_source mengevaluasi terhadap baris tersebut dan mengembalikan tataan hasil kosong.

Untuk informasi selengkapnya, lihat bagian Keterangan.

left_table_source

Sumber tabel seperti yang didefinisikan dalam argumen sebelumnya. Untuk informasi lebih lanjut, lihat bagian Keterangan.

right_table_source

Sumber tabel seperti yang didefinisikan dalam argumen sebelumnya. Untuk informasi lebih lanjut, lihat bagian Keterangan.

Klausul PIVOT

pivot_clause PIVOT <table_source>

Menentukan bahwa table_source dipivot berdasarkan pivot_column. table_source adalah ekspresi tabel atau tabel. Output adalah tabel yang berisi semua kolom table_source kecuali pivot_column dan value_column. Kolom table_source, kecuali pivot_column dan value_column, disebut kolom pengelompokan operator pivot. Untuk informasi selengkapnya tentang PIVOT dan UNPIVOT, lihat Menggunakan PIVOT dan UNPIVOT.

PIVOT melakukan operasi pengelompokan pada tabel input sehubungan dengan kolom pengelompokan dan mengembalikan satu baris untuk setiap grup. Selain itu, output berisi satu kolom untuk setiap nilai yang ditentukan dalam column_list yang muncul di pivot_column input_table.

Untuk informasi selengkapnya, lihat bagian Keterangan yang mengikuti.

aggregate_function

Fungsi agregat yang ditentukan sistem atau pengguna yang menerima satu atau beberapa input. Fungsi agregat harus invariant ke nilai null. Fungsi agregat yang invarians ke nilai null tidak mempertimbangkan nilai null dalam grup saat mengevaluasi nilai agregat.

Fungsi agregat sistem COUNT(*) tidak diizinkan.

value_column

Kolom nilai operator PIVOT. Saat digunakan dengan UNPIVOT, value_column tidak dapat menjadi nama kolom yang ada di table_source input.

UNTUK pivot_column

Kolom pivot operator PIVOT. pivot_column harus berjenis secara implisit atau eksplisit dapat dikonversi ke nvarchar(). Kolom ini tidak boleh berupa gambar atau rowversion.

Ketika UNPIVOT digunakan, pivot_column adalah nama kolom output yang menjadi sempit dari table_source. Tidak boleh ada kolom yang ada di table_source dengan nama tersebut.

IN ( column_list )

Dalam klausa PIVOT, mencantumkan nilai dalam pivot_column yang menjadi nama kolom tabel output. Daftar tidak dapat menentukan nama kolom apa pun yang sudah ada di table_source input yang sedang dipivot.

Dalam klausa UNPIVOT, mencantumkan kolom di table_source yang dipersempit menjadi satu pivot_column.

table_alias

Nama alias tabel output. pivot_table_alias harus ditentukan.

unpivot_clause UNPIVOT <>

Menentukan bahwa tabel input dipersempit dari beberapa kolom dalam column_list ke dalam satu kolom yang disebut pivot_column. Untuk informasi selengkapnya tentang PIVOT dan UNPIVOT, lihat Menggunakan PIVOT dan UNPIVOT.

PADA <date_time>

Berlaku untuk: SQL Server 2016 (13.x) dan versi yang lebih baru, dan SQL Database.

Mengembalikan tabel dengan catatan tunggal untuk setiap baris yang berisi nilai aktual (saat ini) pada titik waktu yang ditentukan di masa lalu. Secara internal, penyatuan dilakukan antara tabel temporal dan tabel riwayatnya dan hasilnya difilter untuk mengembalikan nilai dalam baris yang valid pada titik waktu yang ditentukan oleh parameter date_time>.< Nilai untuk baris dianggap valid jika nilai system_start_time_column_name kurang dari atau sama dengan< nilai parameter date_time> dan nilai system_end_time_column_name lebih besar dari <nilai parameter date_time.>

DARI <start_date_time> KE <end_date_time>

Berlaku untuk: SQL Server 2016 (13.x) dan versi yang lebih baru, dan SQL Database.

Mengembalikan tabel dengan nilai untuk semua versi rekaman yang aktif dalam rentang waktu yang ditentukan, terlepas dari apakah mereka mulai aktif sebelum <nilai parameter start_date_time> untuk argumen FROM atau berhenti aktif setelah <nilai parameter end_date_time> untuk argumen TO. Secara internal, penyatuan dilakukan antara tabel temporal dan tabel riwayatnya dan hasilnya difilter untuk mengembalikan nilai untuk semua versi baris yang aktif kapan saja selama rentang waktu yang ditentukan. Baris yang menjadi aktif persis pada batas bawah yang ditentukan oleh titik akhir FROM disertakan dan baris yang menjadi aktif tepat pada batas atas yang ditentukan oleh titik akhir TO tidak disertakan.

ANTARA <start_date_time> DAN <end_date_time>

Berlaku untuk: SQL Server 2016 (13.x) dan versi yang lebih baru, dan SQL Database.

Sama seperti di atas dalam deskripsi FROM <start_date_time> TO <end_date_time> , kecuali menyertakan baris yang menjadi aktif pada batas atas yang ditentukan oleh <titik akhir end_date_time> .

TERKANDUNG DALAM (<start_date_time> , <end_date_time>)

Berlaku untuk: SQL Server 2016 (13.x) dan versi yang lebih baru, dan SQL Database.

Mengembalikan tabel dengan nilai untuk semua versi rekaman yang dibuka dan ditutup dalam rentang waktu yang ditentukan oleh dua nilai tanggalwaktu untuk argumen CONTAINED IN. Baris yang menjadi aktif tepat pada batas bawah atau berhenti aktif tepat di batas atas disertakan.

SEMUA

Mengembalikan tabel dengan nilai dari semua baris dari tabel saat ini dan tabel riwayat.

Keterangan

Klausa FROM mendukung sintaks SQL-92 untuk tabel gabungan dan tabel turunan. Sintaks SQL-92 menyediakan operator INNER, LEFT OUTER, RIGHT OUTER, FULL OUTER, dan CROSS join.

UNION dan JOIN dalam klausul FROM didukung dalam tampilan dan dalam tabel dan subkueri turunan.

Gabungan mandiri adalah tabel yang digabungkan dengan dirinya sendiri. Sisipkan atau perbarui operasi yang didasarkan pada gabungan mandiri mengikuti urutan dalam klausa FROM.

Karena SQL Server mempertimbangkan statistik distribusi dan kardinalitas dari server tertaut yang menyediakan statistik distribusi kolom, petunjuk gabungan JARAK JAUH tidak diperlukan untuk mengevaluasi gabungan dari jarak jauh. Prosesor kueri SQL Server mempertimbangkan statistik jarak jauh dan menentukan apakah strategi gabungan jarak jauh sesuai. Petunjuk gabungan JARAK JAUH berguna untuk penyedia yang tidak menyediakan statistik distribusi kolom.

Gunakan APPLY

Operand kiri dan kanan operator APPLY adalah ekspresi tabel. Perbedaan utama antara operand ini adalah bahwa right_table_source dapat menggunakan fungsi bernilai tabel yang mengambil kolom dari left_table_source sebagai salah satu argumen fungsi. left_table_source dapat menyertakan fungsi bernilai tabel, tetapi tidak dapat berisi argumen yang merupakan kolom dari right_table_source.

Operator APPLY bekerja dengan cara berikut untuk menghasilkan sumber tabel untuk klausa FROM:

  1. Mengevaluasi right_table_source terhadap setiap baris left_table_source untuk menghasilkan set baris.

    Nilai dalam right_table_source bergantung pada left_table_source. right_table_source dapat diwakili kira-kira dengan cara ini: TVF(left_table_source.row), di mana TVF merupakan fungsi bernilai tabel.

  2. Menggabungkan kumpulan hasil yang dihasilkan untuk setiap baris dalam evaluasi right_table_source dengan left_table_source dengan melakukan operasi UNION ALL.

    Daftar kolom yang dihasilkan oleh hasil operator APPLY adalah kumpulan kolom dari left_table_source yang dikombinasikan dengan daftar kolom dari right_table_source.

Menggunakan PIVOT dan UNPIVOT

pivot_column dan value_column mengelompokkan kolom yang digunakan oleh operator PIVOT. PIVOT mengikuti proses berikut untuk mendapatkan kumpulan hasil output:

  1. Melakukan GROUP BY pada input_table terhadap kolom pengelompokan dan menghasilkan satu baris output untuk setiap grup.

    Kolom pengelompokan di baris output mendapatkan nilai kolom terkait untuk grup tersebut di input_table.

  2. Menghasilkan nilai untuk kolom dalam daftar kolom untuk setiap baris output dengan melakukan hal berikut:

    1. Pengelompokan juga baris yang dihasilkan di GROUP BY pada langkah sebelumnya terhadap pivot_column.

      Untuk setiap kolom output di column_list, memilih subgrup yang memenuhi kondisi:

      pivot_column = CONVERT(<data type of pivot_column>, 'output_column')

    2. aggregate_function dievaluasi terhadap value_column pada subgrup ini dan hasilnya dikembalikan sebagai nilai output_column yang sesuai. Jika subgrup kosong, SQL Server menghasilkan nilai null untuk output_column tersebut. Jika fungsi agregat adalah COUNT dan subgrup kosong, nol (0) dikembalikan.

Catatan

Pengidentifikasi kolom dalam UNPIVOT klausul mengikuti kolate katalog. Untuk SQL Database, kolase selalu SQL_Latin1_General_CP1_CI_AS. Untuk database yang sebagian berisi SQL Server, kolasenya selalu Latin1_General_100_CI_AS_KS_WS_SC. Jika kolom dikombinasikan dengan kolom lain, maka klausa kolaate (COLLATE DATABASE_DEFAULT) diperlukan untuk menghindari konflik.

Untuk informasi selengkapnya tentang PIVOT dan UNPIVOT termasuk contoh, lihat Menggunakan PIVOT dan UNPIVOT.

Izin

Memerlukan izin untuk pernyataan DELETE, SELECT, atau UPDATE.

Contoh

J. Menggunakan klausa FROM

Contoh berikut mengambil TerritoryID kolom dan Name dari SalesTerritory tabel dalam database sampel AdventureWorks2022.

SELECT TerritoryID,
    Name
FROM Sales.SalesTerritory
ORDER BY TerritoryID;

Berikut set hasilnya.

TerritoryID Name
----------- ------------------------------
1           Northwest
2           Northeast
3           Central
4           Southwest
5           Southeast
6           Canada
7           France
8           Germany
9           Australia
10          United Kingdom
(10 row(s) affected)

B. Gunakan petunjuk pengoptimal TABLOCK dan HOLDLOCK

Transaksi parsial berikut menunjukkan cara menempatkan kunci Employee tabel bersama eksplisit dan cara membaca indeks. Kunci ditahan di seluruh transaksi.

BEGIN TRANSACTION

SELECT COUNT(*)
FROM HumanResources.Employee WITH (TABLOCK, HOLDLOCK);

C. Menggunakan sintaks SQL-92 CROSS JOIN

Contoh berikut mengembalikan produk silang dari dua tabel Employee dan Department dalam database AdventureWorks2022. Daftar semua kemungkinan kombinasi BusinessEntityID baris dan semua Department baris nama dikembalikan.

SELECT e.BusinessEntityID,
    d.Name AS Department
FROM HumanResources.Employee AS e
CROSS JOIN HumanResources.Department AS d
ORDER BY e.BusinessEntityID,
    d.Name;

D. Menggunakan sintaks SQL-92 FULL OUTER JOIN

Contoh berikut mengembalikan nama produk dan pesanan penjualan yang sesuai dalam SalesOrderDetail tabel dalam database AdventureWorks2022. Ini juga mengembalikan pesanan penjualan apa pun yang tidak memiliki produk yang tercantum dalam Product tabel, dan produk apa pun dengan pesanan penjualan selain yang tercantum dalam Product tabel.

-- The OUTER keyword following the FULL keyword is optional.
SELECT p.Name,
    sod.SalesOrderID
FROM Production.Product AS p
FULL JOIN Sales.SalesOrderDetail AS sod
    ON p.ProductID = sod.ProductID
ORDER BY p.Name;

E. Menggunakan sintaks SQL-92 LEFT OUTER JOIN

Contoh berikut menggabungkan dua tabel ProductID dan mempertahankan baris yang tidak cocok dari tabel kiri. Tabel Product dicocokkan dengan SalesOrderDetail tabel pada ProductID kolom di setiap tabel. Semua produk, dipesan dan tidak dipesan, muncul dalam tataan hasil.

SELECT p.Name,
    sod.SalesOrderID
FROM Production.Product AS p
LEFT OUTER JOIN Sales.SalesOrderDetail AS sod
    ON p.ProductID = sod.ProductID
ORDER BY p.Name;

F. Menggunakan sintaks SQL-92 INNER JOIN

Contoh berikut mengembalikan semua nama produk dan ID pesanan penjualan.

-- By default, SQL Server performs an INNER JOIN if only the JOIN
-- keyword is specified.
SELECT p.Name,
    sod.SalesOrderID
FROM Production.Product AS p
INNER JOIN Sales.SalesOrderDetail AS sod
    ON p.ProductID = sod.ProductID
ORDER BY p.Name;

G. Menggunakan sintaks SQL-92 RIGHT OUTER JOIN

Contoh berikut menggabungkan dua tabel TerritoryID dan mempertahankan baris yang tidak cocok dari tabel kanan. Tabel SalesTerritory dicocokkan dengan SalesPerson tabel pada TerritoryID kolom di setiap tabel. Semua tenaga penjualan muncul dalam tataan hasil, apakah mereka diberi wilayah atau tidak.

SELECT st.Name AS Territory,
    sp.BusinessEntityID
FROM Sales.SalesTerritory AS st
RIGHT OUTER JOIN Sales.SalesPerson AS sp
    ON st.TerritoryID = sp.TerritoryID;

H. Gunakan petunjuk gabungan HASH dan MERGE

Contoh berikut melakukan gabungan tiga tabel di antara Producttabel , , ProductVendordan Vendor untuk menghasilkan daftar produk dan vendornya. Pengoptimal kueri bergabung Product dan ProductVendor (p dan pv) dengan menggunakan gabungan MERGE. Selanjutnya, hasil gabungan Product dan ProductVendor MERGE (p dan pv) adalah HASH yang digabungkan ke Vendor tabel untuk menghasilkan (p dan pv) dan v.

Penting

Setelah petunjuk gabungan ditentukan, kata kunci INNER tidak lagi opsional dan harus dinyatakan secara eksplisit agar INNER JOIN dilakukan.

SELECT p.Name AS ProductName,
    v.Name AS VendorName
FROM Production.Product AS p
INNER MERGE JOIN Purchasing.ProductVendor AS pv
    ON p.ProductID = pv.ProductID
INNER HASH JOIN Purchasing.Vendor AS v
    ON pv.BusinessEntityID = v.BusinessEntityID
ORDER BY p.Name,
    v.Name;

I. Menggunakan tabel turunan

Contoh berikut menggunakan tabel turunan, SELECT pernyataan setelah FROM klausul, untuk mengembalikan nama depan dan belakang semua karyawan dan kota tempat mereka tinggal.

SELECT RTRIM(p.FirstName) + ' ' + LTRIM(p.LastName) AS Name,
    d.City
FROM Person.Person AS p
INNER JOIN HumanResources.Employee e
    ON p.BusinessEntityID = e.BusinessEntityID
INNER JOIN (
    SELECT bea.BusinessEntityID,
        a.City
    FROM Person.Address AS a
    INNER JOIN Person.BusinessEntityAddress AS bea
        ON a.AddressID = bea.AddressID
    ) AS d
    ON p.BusinessEntityID = d.BusinessEntityID
ORDER BY p.LastName,
    p.FirstName;

j. Menggunakan TABLESAMPLE untuk membaca data dari sampel baris dalam tabel

Contoh berikut menggunakan dalam FROM klausul TABLESAMPLE untuk mengembalikan sekitar 10 persentase semua baris dalam Customer tabel.

SELECT *
FROM Sales.Customer TABLESAMPLE SYSTEM(10 PERCENT);

K. Gunakan APPLY

Contoh berikut mengasumsikan bahwa tabel dan fungsi bernilai tabel berikut ada dalam database:

Nama Objek Nama Kolom
Departments DeptID, DivisionID, DeptName, DeptMgrID
EmpMgr MgrID, EmpID
Karyawan EmpID, EmpLastName, EmpFirstName, EmpSalary
GetReports(MgrID) EmpID, EmpLastName, EmpSalary

Fungsi GetReports bernilai tabel, mengembalikan daftar semua karyawan yang melaporkan secara langsung atau tidak langsung ke yang ditentukan MgrID.

Contohnya menggunakan APPLY untuk mengembalikan semua departemen dan semua karyawan di departemen tersebut. Jika departemen tertentu tidak memiliki karyawan, tidak akan ada baris yang dikembalikan untuk departemen tersebut.

SELECT DeptID,
    DeptName,
    DeptMgrID,
    EmpID,
    EmpLastName,
    EmpSalary
FROM Departments d
CROSS APPLY dbo.GetReports(d.DeptMgrID);

Jika Anda ingin kueri menghasilkan baris untuk departemen tersebut tanpa karyawan, yang akan menghasilkan nilai null untuk EmpIDkolom , dan EmpLastName EmpSalary , gunakan OUTER APPLY sebagai gantinya.

SELECT DeptID,
    DeptName,
    DeptMgrID,
    EmpID,
    EmpLastName,
    EmpSalary
FROM Departments d
OUTER APPLY dbo.GetReports(d.DeptMgrID);

L. Gunakan CROSS APPLY

Contoh berikut mengambil rekam jepret semua rencana kueri yang berada di cache paket, dengan mengkueri sys.dm_exec_cached_plans tampilan manajemen dinamis untuk mengambil handel rencana dari semua rencana kueri di cache. CROSS APPLY Kemudian operator ditentukan untuk meneruskan handel paket ke sys.dm_exec_query_plan. Output Xml Showplan untuk setiap paket yang saat ini berada dalam cache paket berada di query_plan kolom tabel yang dikembalikan.

USE master;
GO

SELECT dbid,
    object_id,
    query_plan
FROM sys.dm_exec_cached_plans AS cp
CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle);
GO

M. Gunakan FOR SYSTEM_TIME

Berlaku untuk: SQL Server 2016 (13.x) dan versi yang lebih baru, dan SQL Database.

Contoh berikut menggunakan argumen FOR SYSTEM_TIME AS OF date_time_literal_or_variable untuk mengembalikan baris tabel yang sebenarnya (saat ini) per 1 Januari 2014.

SELECT DepartmentNumber,
    DepartmentName,
    ManagerID,
    ParentDepartmentNumber
FROM DEPARTMENT
FOR SYSTEM_TIME AS OF '2014-01-01'
WHERE ManagerID = 5;

Contoh berikut menggunakan argumen FOR SYSTEM_TIME FROM date_time_literal_or_variable TO date_time_literal_or_variable untuk mengembalikan semua baris yang aktif selama periode yang didefinisikan mulai 1 Januari 2013 dan berakhir dengan 1 Januari 2014, tidak termasuk batas atas.

SELECT DepartmentNumber,
    DepartmentName,
    ManagerID,
    ParentDepartmentNumber
FROM DEPARTMENT
FOR SYSTEM_TIME FROM '2013-01-01' TO '2014-01-01'
WHERE ManagerID = 5;

Contoh berikut menggunakan argumen FOR SYSTEM_TIME BETWEEN date_time_literal_or_variable AND date_time_literal_or_variable untuk mengembalikan semua baris yang aktif selama periode yang didefinisikan mulai 1 Januari 2013 dan berakhir dengan 1 Januari 2014, termasuk batas atas.

SELECT DepartmentNumber,
    DepartmentName,
    ManagerID,
    ParentDepartmentNumber
FROM DEPARTMENT
FOR SYSTEM_TIME BETWEEN '2013-01-01' AND '2014-01-01'
WHERE ManagerID = 5;

Contoh berikut menggunakan argumen FOR SYSTEM_TIME CONTAINED IN (date_time_literal_or_variable, date_time_literal_or_variable) untuk mengembalikan semua baris yang dibuka dan ditutup selama periode yang ditentukan sebagai dimulai dengan 1 Januari 2013 dan berakhir dengan 1 Januari 2014.

SELECT DepartmentNumber,
    DepartmentName,
    ManagerID,
    ParentDepartmentNumber
FROM DEPARTMENT
FOR SYSTEM_TIME CONTAINED IN ('2013-01-01', '2014-01-01')
WHERE ManagerID = 5;

Contoh berikut menggunakan variabel daripada literal untuk menyediakan nilai batas tanggal untuk kueri.

DECLARE @AsOfFrom DATETIME2 = DATEADD(month, -12, SYSUTCDATETIME());
DECLARE @AsOfTo DATETIME2 = DATEADD(month, -6, SYSUTCDATETIME());

SELECT DepartmentNumber,
    DepartmentName,
    ManagerID,
    ParentDepartmentNumber
FROM DEPARTMENT
FOR SYSTEM_TIME
FROM @AsOfFrom TO @AsOfTo
WHERE ManagerID = 5;

Contoh: Azure Synapse Analytics and Analytics Platform System (PDW)

N. Menggunakan sintaks INNER JOIN

Contoh berikut mengembalikan SalesOrderNumberkolom , ProductKey, dan EnglishProductName dari FactInternetSales tabel dan DimProduct tempat kunci gabungan, ProductKey, cocok di kedua tabel. Kolom SalesOrderNumber dan EnglishProductName masing-masing hanya ada di salah satu tabel, sehingga tidak perlu menentukan alias tabel dengan kolom ini, seperti yang ditunjukkan; alias ini disertakan untuk keterbacaan. Kata AS sebelum nama alias tidak diperlukan tetapi direkomendasikan untuk keterbacaan dan sesuai dengan standar ANSI.

-- Uses AdventureWorks
  
SELECT fis.SalesOrderNumber,
    dp.ProductKey,
    dp.EnglishProductName
FROM FactInternetSales AS fis
INNER JOIN DimProduct AS dp
    ON dp.ProductKey = fis.ProductKey;

INNER Karena kata kunci tidak diperlukan untuk gabungan dalam, kueri yang sama ini dapat ditulis sebagai:

-- Uses AdventureWorks
  
SELECT fis.SalesOrderNumber,
    dp.ProductKey,
    dp.EnglishProductName
FROM FactInternetSales AS fis
INNER JOIN DimProduct AS dp
    ON dp.ProductKey = fis.ProductKey;

WHERE Klausa juga dapat digunakan dengan kueri ini untuk membatasi hasil. Contoh ini membatasi hasil ke SalesOrderNumber nilai yang lebih tinggi dari 'SO5000':

-- Uses AdventureWorks
  
SELECT fis.SalesOrderNumber,
    dp.ProductKey,
    dp.EnglishProductName
FROM FactInternetSales AS fis
INNER JOIN DimProduct AS dp
    ON dp.ProductKey = fis.ProductKey
WHERE fis.SalesOrderNumber > 'SO50000'
ORDER BY fis.SalesOrderNumber;

O. Gunakan sintaks LEFT OUTER JOIN dan RIGHT OUTER JOIN

Contoh berikut menggabungkan FactInternetSales tabel dan DimProduct pada ProductKey kolom. Sintaks gabungan luar kiri mempertahankan baris yang tidak cocok dari tabel sebelah kiri (FactInternetSales). FactInternetSales Karena tabel tidak berisi nilai apa pun ProductKey yang tidak cocok dengan DimProduct tabel, kueri ini mengembalikan baris yang sama dengan contoh gabungan dalam pertama sebelumnya dalam artikel ini.

-- Uses AdventureWorks
  
SELECT fis.SalesOrderNumber,
    dp.ProductKey,
    dp.EnglishProductName
FROM FactInternetSales AS fis
LEFT OUTER JOIN DimProduct AS dp
    ON dp.ProductKey = fis.ProductKey;

Kueri ini juga dapat ditulis tanpa OUTER kata kunci.

Di gabungan luar kanan, baris yang tidak cocok dari tabel kanan dipertahankan. Contoh berikut mengembalikan baris yang sama dengan contoh gabungan luar kiri di atas.

-- Uses AdventureWorks
  
SELECT fis.SalesOrderNumber,
    dp.ProductKey,
    dp.EnglishProductName
FROM DimProduct AS dp
RIGHT OUTER JOIN FactInternetSales AS fis
    ON dp.ProductKey = fis.ProductKey;

Kueri berikut menggunakan DimSalesTerritory tabel sebagai tabel kiri di gabungan luar kiri. Ini mengambil SalesOrderNumber nilai dari FactInternetSales tabel. Jika tidak ada pesanan untuk tertentu SalesTerritoryKey, kueri mengembalikan NULL untuk baris tersebut SalesOrderNumber . Kueri ini diurutkan menurut SalesOrderNumber kolom, sehingga SETIAP NULL dalam kolom ini muncul di bagian atas hasil.

-- Uses AdventureWorks
  
SELECT dst.SalesTerritoryKey,
    dst.SalesTerritoryRegion,
    fis.SalesOrderNumber
FROM DimSalesTerritory AS dst
LEFT OUTER JOIN FactInternetSales AS fis
    ON dst.SalesTerritoryKey = fis.SalesTerritoryKey
ORDER BY fis.SalesOrderNumber;

Kueri ini dapat ditulis ulang dengan gabungan luar kanan untuk mengambil hasil yang sama:

-- Uses AdventureWorks
  
SELECT dst.SalesTerritoryKey,
    dst.SalesTerritoryRegion,
    fis.SalesOrderNumber
FROM FactInternetSales AS fis
RIGHT OUTER JOIN DimSalesTerritory AS dst
    ON fis.SalesTerritoryKey = dst.SalesTerritoryKey
ORDER BY fis.SalesOrderNumber;

P. Menggunakan sintaks FULL OUTER JOIN

Contoh berikut menunjukkan gabungan luar penuh, yang mengembalikan semua baris dari kedua tabel yang digabungkan tetapi mengembalikan NULL untuk nilai yang tidak cocok dari tabel lain.

-- Uses AdventureWorks
  
SELECT dst.SalesTerritoryKey,
    dst.SalesTerritoryRegion,
    fis.SalesOrderNumber
FROM DimSalesTerritory AS dst
FULL JOIN FactInternetSales AS fis
    ON dst.SalesTerritoryKey = fis.SalesTerritoryKey
ORDER BY fis.SalesOrderNumber;

Kueri ini juga dapat ditulis tanpa OUTER kata kunci.

-- Uses AdventureWorks
  
SELECT dst.SalesTerritoryKey,
    dst.SalesTerritoryRegion,
    fis.SalesOrderNumber
FROM DimSalesTerritory AS dst
FULL JOIN FactInternetSales AS fis
    ON dst.SalesTerritoryKey = fis.SalesTerritoryKey
ORDER BY fis.SalesOrderNumber;

T. Menggunakan sintaks CROSS JOIN

Contoh berikut mengembalikan produk silang dari FactInternetSales tabel dan DimSalesTerritory . Daftar semua kemungkinan kombinasi SalesOrderNumber dan SalesTerritoryKey dikembalikan. Perhatikan tidak adanya ON klausa dalam kueri gabungan silang.

-- Uses AdventureWorks
  
SELECT dst.SalesTerritoryKey,
    fis.SalesOrderNumber
FROM DimSalesTerritory AS dst
CROSS JOIN FactInternetSales AS fis
ORDER BY fis.SalesOrderNumber;

R. Menggunakan tabel turunan

Contoh berikut menggunakan tabel turunan ( SELECT pernyataan setelah FROM klausul) untuk mengembalikan CustomerKey kolom dan LastName semua pelanggan dalam DimCustomer tabel dengan BirthDate nilai lebih lambat dari 1 Januari 1970 dan nama belakang 'Smith'.

-- Uses AdventureWorks
  
SELECT CustomerKey,
    LastName
FROM (
    SELECT *
    FROM DimCustomer
    WHERE BirthDate > '01/01/1970'
    ) AS DimCustomerDerivedTable
WHERE LastName = 'Smith'
ORDER BY LastName;

S. Contoh petunjuk gabungan REDUCE

Contoh berikut menggunakan REDUCE petunjuk gabungan untuk mengubah pemrosesan tabel turunan dalam kueri. Saat menggunakan REDUCE petunjuk gabungan dalam kueri ini, fis.ProductKey diproyeksikan, direplikasi dan dibuat berbeda, lalu digabungkan selama DimProduct pengacakan DimProduct pada ProductKey. Tabel turunan yang dihasilkan didistribusikan pada fis.ProductKey.

-- Uses AdventureWorks
  
SELECT SalesOrderNumber
FROM (
    SELECT fis.SalesOrderNumber,
        dp.ProductKey,
        dp.EnglishProductName
    FROM DimProduct AS dp
    INNER REDUCE JOIN FactInternetSales AS fis
        ON dp.ProductKey = fis.ProductKey
    ) AS dTable
ORDER BY SalesOrderNumber;

T. Contoh petunjuk gabungan REPLIKASI

Contoh berikutnya ini memperlihatkan kueri yang sama dengan contoh sebelumnya, kecuali bahwa REPLICATE petunjuk gabungan digunakan alih-alih REDUCE petunjuk gabungan. Penggunaan REPLICATE petunjuk menyebabkan nilai dalam ProductKey kolom (bergabung) dari FactInternetSales tabel direplikasi ke semua simpul. Tabel DimProduct digabungkan ke versi nilai-nilai tersebut yang direplikasi.

-- Uses AdventureWorks

SELECT SalesOrderNumber
FROM (
    SELECT fis.SalesOrderNumber,
        dp.ProductKey,
        dp.EnglishProductName
    FROM DimProduct AS dp
    INNER REPLICATE JOIN FactInternetSales AS fis
        ON dp.ProductKey = fis.ProductKey
    ) AS dTable
ORDER BY SalesOrderNumber;

U. Gunakan petunjuk REDISTRIBUTE untuk menjamin pemindahan Acak untuk gabungan distribusi yang tidak kompatibel

Kueri berikut menggunakan petunjuk kueri REDISTRIBUTE pada gabungan distribusi yang tidak kompatibel. Ini menjamin pengoptimal kueri menggunakan pemindahan Acak dalam rencana kueri. Ini juga menjamin rencana kueri tidak akan menggunakan pemindahan Siaran, yang memindahkan tabel terdistribusi ke tabel yang direplikasi.

Dalam contoh berikut, petunjuk REDISTRIBUTE memaksa pemindahan Shuffle pada tabel FactInternetSales karena ProductKey adalah kolom distribusi untuk DimProduct, dan bukan kolom distribusi untuk FactInternetSales.

-- Uses AdventureWorks
  
SELECT dp.ProductKey,
    fis.SalesOrderNumber,
    fis.TotalProductCost
FROM DimProduct AS dp
INNER REDISTRIBUTE JOIN FactInternetSales AS fis
    ON dp.ProductKey = fis.ProductKey;

V. Menggunakan TABLESAMPLE untuk membaca data dari sampel baris dalam tabel

Contoh berikut menggunakan dalam FROM klausul TABLESAMPLE untuk mengembalikan sekitar 10 persentase semua baris dalam Customer tabel.

SELECT *
FROM Sales.Customer TABLESAMPLE SYSTEM(10 PERCENT);