FROM (Entity SQL)
Menentukan koleksi yang digunakan dalam pernyataan SELECT.
Sintaks
FROM expression [ ,...n ] AS C
Argumen
expression
Semua ekspresi kueri valid yang menghasilkan koleksi untuk digunakan sebagai sumber dalam pernyataan SELECT
.
Keterangan
Klausul FROM
adalah daftar satu atau beberapa item klausul FROM
yang dipisahkan koma. Klausul FROM
dapat digunakan untuk menentukan satu sumber atau lebih untuk pernyataan SELECT
. Bentuk klausul FROM
yang paling sederhana adalah ekspresi kueri tunggal yang mengidentifikasi koleksi dan alias yang digunakan sebagai sumber dalam pernyataan SELECT
, seperti yang diilustrasikan dalam contoh berikut:
FROM C as c
Item Klausul FROM
Setiap item klausul FROM
mengacu pada kumpulan sumber dalam kueri Entity SQL. Entity SQL mendukung kelas item klausul FROM
berikut: item klausul FROM
sederhana, item klausul JOIN FROM
, dan item klausul APPLY FROM
. Setiap item klausul FROM
ini dijelaskan secara lebih mendetail di bagian berikut.
Item Klausul FROM Sederhana
Item klausul FROM
yang paling sederhana adalah ekspresi tunggal yang mengidentifikasi koleksi dan alias. Ekspresi hanya dapat berupa set entitas, atau subkueri, atau ekspresi lain yang merupakan jenis koleksi. Berikut ini adalah contohnya:
LOB.Customers as c
Spesifikasi alias bersifat opsional. Spesifikasi alternatif item klausul di atas bisa menjadi sebagai berikut:
LOB.Customers
Jika tidak ada alias yang ditentukan, Entity SQL mencoba menghasilkan alias berdasarkan ekspresi koleksi.
Item Klausul JOIN FROM
Item klausul JOIN FROM
mewakili gabungan antara dua item klausul FROM
. Entity SQL mendukung gabungan silang, gabungan dalam, gabungan kiri dan kanan luar, dan gabungan luar penuh. Semua gabungan ini didukung seperti halnya dukungan dalam Transact-SQL. Seperti dalam Transact-SQL, dua item klausul FROM
yang digunakan dalam JOIN
harus independen. Artinya, keduanya tidak dapat berkorelasi. CROSS APPLY
atau OUTER APPLY
dapat digunakan untuk kasus ini.
Gabungan Silang
Ekspresi kueri CROSS JOIN
menghasilkan produk Cartesian dengan dua koleksi, seperti yang diilustrasikan dalam contoh berikut:
FROM C AS c CROSS JOIN D as d
Gabungan Dalam
INNER JOIN
menghasilkan produk Cartesian terbatas dengan dua koleksi, seperti yang diilustrasikan dalam contoh berikut:
FROM C AS c [INNER] JOIN D AS d ON e
Ekspresi kueri sebelumnya memproses kombinasi setiap elemen koleksi di sebelah kiri yang dipasangkan dengan setiap elemen koleksi di sebelah kanan, di mana kondisi ON
-nya true. Jika tidak ada kondisi ON
yang ditentukan, INNER JOIN
akan berdegenerasi menjadi CROSS JOIN
.
Gabungan Kiri Luar dan Gabungan Kanan Luar
Ekspresi kueri OUTER JOIN
menghasilkan produk Cartesian terbatas dengan dua koleksi, seperti yang diilustrasikan dalam contoh berikut:
FROM C AS c LEFT OUTER JOIN D AS d ON e
Ekspresi kueri sebelumnya memproses kombinasi setiap elemen koleksi di sebelah kiri yang dipasangkan dengan setiap elemen koleksi di sebelah kanan, di mana kondisi ON
-nya true. Jika kondisi ON
-nya false, ekspresi tetap memproses satu instans elemen di sebelah kiri yang dipasangkan dengan elemen di sebelah kanan, dengan nilai null.
RIGHT OUTER JOIN
mungkin dinyatakan dengan cara yang sama.
Gabungan Penuh Luar
FULL OUTER JOIN
eksplisit menghasilkan produk Cartesian terbatas dengan dua koleksi seperti yang diilustrasikan dalam contoh berikut:
FROM C AS c FULL OUTER JOIN D AS d ON e
Ekspresi kueri sebelumnya memproses kombinasi setiap elemen koleksi di sebelah kiri yang dipasangkan dengan setiap elemen koleksi di sebelah kanan, di mana kondisi ON
-nya true. Jika kondisi ON
-nya false, ekspresi tetap memproses satu instans elemen di sebelah kiri yang dipasangkan dengan elemen di sebelah kanan, dengan nilai null. Ini juga memproses satu instans elemen di sebelah kanan yang dipasangkan dengan elemen di sebelah kiri, dengan nilai null.
Catatan
Untuk mempertahankan kompatibilitas dengan SQL-92, di Transact-SQL, kata kunci OUTER bersifat opsional. Oleh karena itu, LEFT JOIN
, RIGHT JOIN
, dan FULL JOIN
adalah sinonim untuk LEFT OUTER JOIN
, RIGHT OUTER JOIN
, dan FULL OUTER JOIN
.
Item Klausul APPLY
Entity SQL mendukung dua jenis APPLY
: CROSS APPLY
dan OUTER APPLY
.
CROSS APPLY
menghasilkan pasangan unik setiap elemen koleksi di sebelah kiri dengan elemen koleksi yang dihasilkan dengan mengevaluasi ekspresi di sebelah kanan. Dengan CROSS APPLY
, ekspresi di sebelah kanan secara fungsional bergantung pada elemen di sebelah kiri, seperti yang diilustrasikan dalam contoh koleksi terkait berikut:
SELECT c, f FROM C AS c CROSS APPLY c.Assoc AS f
Perilaku CROSS APPLY
mirip dengan daftar gabungan. Jika ekspresi di sebelah kanan dievaluasi ke koleksi kosong, CROSS APPLY
tidak menghasilkan pasangan untuk instans elemen tersebut di sebelah kiri.
OUTER APPLY
menyerupai CROSS APPLY
, kecuali pasangan tetap dihasilkan meskipun ekspresi di sebelah kanan dievaluasi ke koleksi kosong. Berikut contoh OUTER APPLY
:
SELECT c, f FROM C AS c OUTER APPLY c.Assoc AS f
Catatan
Tidak seperti dalam Transact-SQL, tidak perlu langkah eksplisit yang tidak diatur dalam Entity SQL.
Catatan
Operator CROSS
and OUTER APPLY
diperkenalkan di SQL Server 2005. Dalam beberapa kasus, alur kueri mungkin menghasilkan Transact-SQL yang berisi operator CROSS APPLY
dan/atau OUTER APPLY
. Karena beberapa penyedia backend, termasuk versi SQL Server yang lebih lama dari SQL Server 2005, tidak mendukung operator ini, kueri tersebut tidak dapat dijalankan pada penyedia backend ini.
Beberapa skenario umum yang mungkin menyebabkan keberadaan operator CROSS APPLY
dan/atau OUTER APPLY
dalam kueri output adalah: subkueri yang berkorelasi dengan paging; AnyElement melalui subkueri yang berkorelasi atau melalui koleksi yang dihasilkan oleh navigasi; Kueri LINQ yang menggunakan metode pengelompokan yang menerima pemilih elemen; kueri di mana CROSS APPLY
atau OUTER APPLY
ditentukan secara eksplisit; kueri yang memiliki konstruksi DEREF
di atas konstruksi REF
.
Beberapa Koleksi dalam Klausul FROM
Klausul FROM
dapat berisi lebih dari satu koleksi yang dipisahkan koma. Dalam kasus ini, koleksi diasumsikan digabungkan. Anggap ini sebagai CROSS JOIN n-arah.
Dalam contoh berikut, C
dan D
adalah koleksi independen, tetapi c.Names
bergantung pada C
.
FROM C AS c, D AS d, c.Names AS e
Contoh sebelumnya secara logis sama dengan contoh berikut:
FROM (C AS c JOIN D AS d) CROSS APPLY c.Names AS e
Korelasi Kiri
Item dalam klausul FROM
dapat merujuk ke item yang ditentukan dalam klausul sebelumnya. Dalam contoh berikut, C
dan D
adalah koleksi independen, tetapi c.Names
bergantung pada C
:
from C as c, D as d, c.Names as e
Ini secara logis sama dengan:
from (C as c join D as d) cross apply c.Names as e
Semantik
Secara logis, koleksi dalam klausul FROM
diasumsikan sebagai bagian dari gabungan silang n
-arah (kecuali dalam kasus gabungan silang 1-arah). Alias dalam klausul FROM
diproses dari kiri ke kanan, dan ditambahkan ke cakupan saat ini untuk referensi berikutnya. Klausul FROM
diasumsikan menghasilkan multiset baris. Akan ada satu bidang untuk setiap item dalam klausul FROM
yang mewakili satu elemen dari item koleksi tersebut.
Klausul FROM
secara logis menghasilkan multiset baris jenis Row(c, d, e) di mana bidang c, d, dan e diasumsikan sebagai jenis elemen C
, D
, dan c.Names
.
Entity SQL memperkenalkan alias untuk setiap item klausul FROM
sederhana dalam cakupan. Misalnya, dalam cuplikan klausul FROM berikut, Nama yang diperkenalkan ke dalam cakupan adalah c, d, dan e.
from (C as c join D as d) cross apply c.Names as e
Di Entity SQL (tidak seperti Transact-SQL), klausul FROM
hanya memperkenalkan alias ke dalam cakupan. Setiap referensi ke kolom (properti) koleksi ini harus memenuhi syarat dengan alias.
Menarik Kunci dari Kueri Bertingkat
Jenis kueri tertentu yang mengharuskan penarikan kunci dari kueri bertingkat tidak didukung. Misalnya, kueri berikut ini valid:
select c.Orders from Customers as c
Namun, kueri berikut ini tidak valid, karena kueri bertingkat tidak memiliki kunci apa pun:
select {1} from {2, 3}