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:
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:
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 manaTVF
merupakan fungsi bernilai tabel.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:
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.
Menghasilkan nilai untuk kolom dalam daftar kolom untuk setiap baris output dengan melakukan hal berikut:
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')
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 Product
tabel , , ProductVendor
dan 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 EmpID
kolom , 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 SalesOrderNumber
kolom , 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);