Koneksi kiri 1s 8. Koneksi kiri dan kanan


Ketika kita ingin melihat data dari beberapa tabel secara bersamaan, mis. untuk mengumpulkan beberapa tabel menjadi satu, muncullah konsep menghubungkan tabel dan hubungan antar tabel. Ada empat jenis koneksi:

  • kiri;
  • Kanan,
  • intern;
  • menyelesaikan.

Kami akan melihat setiap jenis menggunakan contoh abstrak. Ada 2 tabel, yang pertama kami menyimpan informasi deskriptif tentang barang tersebut, yang kedua tentang saldonya:

Untuk mendapatkan satu dari tabel ini, kita perlu secara eksplisit menunjukkan bidang mana yang akan kita sambungkan, dengan kondisi dan jenis apa. Sekarang semuanya akan menjadi lebih jelas.

Koneksi kiri

Dengan menggunakan gabungan kiri, kami memberi tahu sistem bahwa sebagai hasilnya kami ingin melihat semua catatan dari tabel kiri dan catatan dari tabel kanan yang memenuhi kondisi koneksi. Misalkan kita menghubungkan tabel berdasarkan field produk dengan kondisi yang sama, maka kita akan mendapatkan tabel seperti:

Permintaan.Teks =
"MEMILIH
| Nomenklatur.Produk,
| Tata Nama.Warna SEBAGAI WarnaTata Nama,
| Tetap.Warna SEBAGAI WarnaTetap,
| Saldo. Kuantitas
|DARI

";

Tidak ada kecocokan kursi dari tabel sisa, sehingga field diisi dengan nilai NULL, yang harus diproses oleh fungsi ISNULL, lihat 1C 8 Fungsi Bahasa Query.

Gabungan kiri bekerja kira-kira seperti perulangan dalam satu perulangan - ia mengambil catatan pertama dari tabel kiri dan menjalankan semua catatan dari tabel kanan untuk memastikan bahwa kondisi koneksi terpenuhi. Kemudian record kedua diambil dari tabel sebelah kiri, dan seterusnya. Jika tiba-tiba beberapa record dari tabel kanan memenuhi kondisi koneksi, maka beberapa baris akan ditambahkan ke tabel yang dihasilkan (sesuai dengan jumlah koneksi yang berhasil). Seperti yang bisa kita lihat, tabel yang dihasilkan tidak informatif, data tidak mencerminkan esensi sebenarnya, jadi lebih baik menghubungkan tabel-tabel ini dengan dua bidang: Produk dan Warna, hanya saja kali ini kita akan menangani NULL:

Permintaan.Teks =
"MEMILIH
| Nomenklatur.Produk,
| Tata nama.Warna,
| ISNULL(Sisa.Jumlah, 0) SEBAGAI Kuantitas
|DARI
| Nomenklatur SEBAGAI Nomenklatur
| KIRI GABUNG Sisa SEBAGAI Sisa
| Nomenklatur Perangkat Lunak.Produk = Sisa.Produk

Koneksi yang benar

Sambungan kanan pada dasarnya tidak berbeda dengan sambungan kiri. Jika Anda menukar tabel, maka gabungan kanan akan berubah menjadi gabungan kiri, terlebih lagi, saat menggunakan konstruktor, sistem itu sendiri mengubah semua gabungan kanan menjadi gabungan kiri.

Gabungan batin

Dengan menggunakan gabungan dalam, kami memberi tahu sistem bahwa sebagai hasilnya kami hanya ingin melihat rekaman yang memenuhi kondisi koneksi dari tabel kanan dan kiri. Dengan demikian, jumlah record yang dihasilkan akan kurang dari atau sama dengan jumlah record dari tabel terpendek yang berpartisipasi dalam penggabungan. Mari kita terapkan gabungan dalam pada bidang Produk dan Warna pada tabel kita:

Permintaan.Teks =
"MEMILIH
| Nomenklatur.Produk,
| Tata nama.Warna,
| Sisa. Kuantitas SEBAGAI Kuantitas
|DARI
| Nomenklatur SEBAGAI Nomenklatur
| Sisa INNER JOIN SEBAGAI Sisa
| Nomenklatur Perangkat Lunak.Produk = Sisa.Produk
| Dan Nomenklatur.Warna = Tersisa.Warna";

Koneksi penuh

Gabungan penuh akan menghasilkan semua catatan dari kedua tabel, catatan-catatan yang memenuhi kondisi koneksi akan terhubung, catatan-catatan yang tidak memenuhi kondisi koneksi akan tetap berakhir di hasil kueri, tetapi dengan beberapa bidang NULL. Lengkap ibarat sambungan kiri dan kanan menjadi satu.

Ada banyak masalah pada topik ini, mari kita coba selesaikan salah satunya. Organisasi kami adalah dealer dari 2 pabrik furnitur: "Zarya" dan "Rassvet". Bermacam-macam dengan biaya masing-masing pabrik disimpan dalam tabel yang berbeda. Penting untuk membuat daftar harga tunggal, dan memasukkan produk dengan harga minimum:

Mari kita terapkan gabungan penuh dengan pilihan semua bidang, kita akan terhubung berdasarkan produk:

Permintaan.Teks =
"MEMILIH
| Tata NamaZarya.Produk SEBAGAI ProdukZarya,
| Tata NamaZarya.Harga SEBAGAI HargaZarya,
| Nomenklatur Rassvet.Produk SEBAGAI Produk Rassvet,
| Tata NamaRassvet.Harga SEBAGAI HargaRassvet
|DARI

Ini bukan yang kita butuhkan, mari gabungkan bidang produk menjadi satu dan proses NULL:

Permintaan.Teks =
"MEMILIH
//konstruksi ISNULL telah dibahas di bagian fungsi bahasa kueri
//jika harga tidak ditentukan, maka inisialisasi
//kenapa 1000000 lihat penjelasan dibawah
| ISNULL(NomenklaturZarya.Harga, 1000000) SEBAGAI HargaZarya,
| ISNULL(NomenclatureRassvet.Price, 1000000) SEBAGAI PriceRassvet
|DARI
| Tata NamaZarya SEBAGAI Tata NamaZarya
| Nomenklatur SAMBUNGAN LENGKAPDawn SEBAGAI NomenklaturFajar
| Nomenklatur Perangkat LunakZarya.Produk = NomenklaturDawn.Produk";

Yang tersisa hanyalah memilih harga minimum. Teks permintaan terakhir akan terlihat seperti ini:

Permintaan.Teks =
"MEMILIH
| ISNULL(NomenclatureZarya.Product, NomenclatureDawn.Product) SEBAGAI Produk,
| PILIHAN
| KETIKA ADA ISNULL(NomenclatureZarya.Price, 1000000) > ISNULL(NomenclatureRassvet.Price, 1000000)
| MAKA ISNULL (NomenklaturRassvet.Harga, 1000000)
| LAINNYA ISNULL(NomenklaturZarya.Harga, 1000000)
| AKHIR SEBAGAI HARGA
|DARI
| Tata NamaZarya SEBAGAI Tata NamaZarya
| Nomenklatur SAMBUNGAN LENGKAPDawn SEBAGAI NomenklaturFajar
| Nomenklatur Perangkat LunakZarya.Produk = NomenklaturDawn.Produk";

Jika harga tidak ditentukan (NULL), maka harus diinisialisasi dengan beberapa nilai, jika tidak, operasi perbandingan lebih/kurang akan gagal dengan kesalahan. Harga tersebut kita inisialisasi dengan jumlah yang besarnya tidak realistis sehingga “kalah” dalam operasi perbandingan, karena sesuai dengan kondisi permasalahan kita memilih harga yang paling rendah.

← Fungsi bahasa kueri 1C 8 | Bergabung dalam kueri 1C 8 →

Perhatian! Ini adalah pelajaran versi pengantar, yang materinya mungkin tidak lengkap.

Masuk ke situs sebagai pelajar

Masuk sebagai siswa untuk mengakses materi sekolah

Bahasa kueri 1C 8.3 untuk pemrogram pemula: koneksi

Bergabung dalam kueri

Bergabung adalah salah satu operasi terpenting dan perlu yang dilakukan oleh sistem manajemen basis data relasional.

Koneksi digunakan untuk string yang cocok satu tabel ke baris tabel lainnya.

Untuk memahami perlunya koneksi, mari kita selesaikan masalah berikut.

Kami memiliki direktori di database kami Klien:

Direktori Warna:

Dan buku referensi Asosiasi:

Tugas kami adalah mendapatkan asosiasi favorit klien berdasarkan warna.

Oleh karena itu, bagi Natasha, rumput akan menjadi pergaulan favoritnya, karena warna favoritnya adalah hijau. Dan bagi Peter - matahari. Anda sedang membaca versi percobaan pelajaran, pelajaran lengkap tersedia.

Bagi Andrey, tidak ada asosiasi yang cocok sama sekali, karena warna favoritnya adalah merah, dan tidak ada asosiasi merah di database.

Kami akan menyelesaikan masalah ini secara bertahap.

Pertama kami akan menanyakan semua klien dan warna favorit mereka:

Kemudian minta semua asosiasi dan warnanya:

Jika kami mencoba menjalankan permintaan ini, kami akan menerima pesan kesalahan:

Alasan kesalahannya adalah bidang tersebut Nama hadir di kedua tabel sekaligus ( Klien Dan Asosiasi) dan sistem tidak mengetahui bidang dari tabel mana yang dimaksud.

Untuk menghilangkan ambiguitas seperti itu ketika mengambil sampel dari lebih dari satu tabel, biasanya ditunjukkan nama bidang lengkap. Nama bidang lengkap mencakup nama tabel lengkap (misalnya, Direktori.Klien) dan nama bidang itu sendiri (misalnya, Nama).

Jadi nama lengkap bidang tersebut adalah Nama dari meja Klien akan Direktori.Klien.Nama.

Dan nama lengkap bidangnya Nama dari meja Asosiasi akan Direktori.Asosiasi.Nama.

Koneksi silang

Mari kita tulis ulang query sebelumnya dengan nama field lengkap:

Kami baru saja memproduksi koneksi silang dua meja. Perhatikan bagaimana hasilnya terbentuk:

Gabungan batin

Jelasnya, hasil penggabungan dua tabel bukanlah solusi untuk masalah kita. Kita tidak membutuhkan semua record dari cross join, tapi hanya record yang fieldnya saja Warna kesukaan Dan Warna mempunyai arti yang sama:

Untuk mendapatkan catatan ini, tambahkan bagian ke permintaan sebelumnya DI MANA:

Inilah yang kami butuhkan - kami telah memecahkan masalahnya!

Dalam kueri terakhir kami menggunakan gabungan silang dengan kondisi tambahan (di bagian DI MANA). Anda sedang membaca versi percobaan pelajaran, pelajaran lengkap tersedia. Koneksi seperti itu disebut internal.

Ada cara lain untuk menulis hal yang sama bergabung secara internal:

Bandingkan ini dan permintaan sebelumnya. Keduanya persis sama dari sudut pandang platform, hanya saja sintaksisnya berbeda. Baik kueri ini maupun kueri sebelumnya berisi gabungan tabel bagian dalam Klien dengan meja Asosiasi berdasarkan bidang Warna kesukaan Dan Warna masing-masing.

Koneksi kiri

Perlu diketahui bahwa hasil inner join tidak menyertakan Andrey. Dan semua itu karena warna favoritnya adalah merah, dan kami tidak memiliki asosiasi merah sama sekali di database kami.

Ternyata bagi Andrey dengan warna merahnya, tidak ada tandingannya di tabel asosiasi.

Mari kita tulis ulang kuerinya sehingga hasilnya menyertakan catatan dari tabel pertama yang tidak ada pasangannya dari tabel kedua (dalam pada kasus ini andrey):

Koneksi ini disebut kiri bergabung.

Rhasil gabung kiri mewakili: segalanya catatan dari gabungan dalam PLUS semuanya catatan dari tabel pertama, tidak termasuk dalam internal

Koneksi yang benar

Tapi mari kita kembali ke inner join lagi:

Perhatikan bahwa hasil inner join tidak mengandung asosiasi salju putih, karena tidak ada klien yang warna favoritnya putih.

Mari kita tulis ulang kuerinya sehingga hasilnya mencakup catatan dari tabel kedua yang pasangannya tidak ditemukan dari tabel pertama (dalam hal ini, salju putih):

Koneksi ini disebut koneksi yang benar.

Hasil gabung kanan adalah: PLUS segalanya catatan dari tabel kedua, tidak termasuk dalam internal koneksi (yang tidak ditemukan pasangannya).

Koneksi penuh

Namun bagaimana jika kita memerlukan hasil kueri untuk disertakan selain inner join Andrey Dan Salju serentak?

Untuk melakukan ini, Anda perlu menggabungkan hasil gabungan kiri dan kanan. Jenis koneksi ini telah ditemukan dan disebut koneksi penuh:

Hasil koneksi penuh mewakili: semua catatan dari gabungan dalam PLUS semua record dari tabel pertama yang tidak termasuk dalam internal koneksi (yang tidak ditemukan pasangannya) PLUS semua record dari tabel kedua yang tidak termasuk dalam internal koneksi (yang tidak ditemukan pasangannya).

Alias ​​tabel

Setuju bahwa semua pertanyaan yang kami tulis dalam pelajaran ini terlihat cukup rumit. Hal ini disebabkan oleh kenyataan bahwa kami terpaksa menunjukkannya nama lengkap bidang untuk menghindari ambiguitas.

Untuk mempersingkat nama tabel lengkap (misalnya, Direktori.Klien) diperbolehkan (dan juga untuk bidang itu sendiri) menggunakan alias.

Mari kita tulis ulang kueri terakhir sehingga saat membuat nama bidang lengkap, bukan Direktori.Klien Anda bisa menggunakan nama samaran KE, dan sebagai gantinya Direktori.Asosiasi- nama samaran A:

Dan untuk membuat hasil query lebih jelas lagi, mari tambahkan alias untuk field yang telah kita lihat di salah satu pelajaran sebelumnya:

Menangani BATAL

Perhatikan lebih dekat hasil kueri terakhir (serta banyak kueri sebelumnya dalam pelajaran ini).

Apa nilai bidangnya? Asosiasi Dan Warnanya untuk baris pertama? Apa yang dapat Anda katakan tentang ladang? Klien Dan Warnanya untuk baris terakhir?

Mereka setara BATAL, yang, seperti yang telah kita ketahui, berarti tidak adanya makna apa pun:

Dan sejak itu BATAL berarti tidak adanya nilai, maka segala upaya untuk melakukan operasi apa pun dengannya (perbandingan, penambahan...) akan menyebabkan perilaku database tidak terdefinisi, kesalahan yang tidak dapat diprediksi.

Itu sebabnya pemrosesan nilai dianggap wajib BATAL kapan pun hal itu mungkin muncul.

Yang kami maksud dengan pemrosesan adalah kami harus menyatakan dalam permintaan kami bahwa salah satu bidangnya sama dengan BATAL, maka beberapa nilai lain harus diganti ke dalam bidang ini.

Dalam hal ini, untuk ladang Klien Dan Asosiasi jika terdeteksi BATAL kami akan mengganti string kosong "".

Dan inilah ladangnya Warnanya Dan Warnanya adalah tautan ke elemen direktori Warna, oleh karena itu, hanya nilai yang merupakan referensi dari tipe tertentu yang dapat diganti ke dalamnya. Setiap tipe referensi (seperti Direktori atau Dokumen) memiliki elemen yang telah ditentukan sebelumnya Tautan Kosong. Untuk menunjukkan nilainya dalam permintaan, kami akan menggunakan fungsi tersebut ARTI.

Untuk mengetahui apa yang ada di lapangan BATAL Kita akan menggunakan fungsi yang sudah kita kenal dari pelajaran sebelumnya TIDAK BOLEH:

PILIH ISNULL( K. Nama, "" ) SEBAGAI Klien, ISNULL( K. Warna Favorit, NILAI(Direktori. Warna. Tautan Kosong) ) SEBAGAI Warnanya, ISNULL( A. Nama, "" ) SEBAGAI Asosiasi, ISNULL( A. Warna, NILAI (Direktori. Warna. Tautan Kosong) ) SEPERTI HerColor DARI Direktori. Klien CARA MENYELESAIKAN Direktori KONEKSI. Asosiasi SEBAGAI OLEH K. Warna Favorit = A. Warna

Secara tampilan (dari query console) hasilnya tidak berubah. Kami masih melihat ladang kosong. Tapi ini hanya karena representasi string punya BATAL dan bidang kosong dari semua jenis sama dan sama dengan string kosong.

Faktanya, kolom kosong tersebut sudah tidak ada lagi BATAL(Tidak bernilai) , Sekarang mereka memiliki nilai (kosong) yang sudah dapat Anda kerjakan (melakukan operasi).

Ingat, nilai kosong dan tidak ada nilai adalah dua hal yang sangat berbeda.

Menggabungkan lebih dari dua tabel

Anda dapat bergabung dengan tabel sebanyak yang Anda suka secara berurutan.

Misalkan kita perlu menyelesaikan masalah berikut. Anda sedang membaca versi percobaan pelajaran, pelajaran lengkap tersedia. Keluaran semua pilihan yang memungkinkan pelanggan dan asosiasi favorit mereka serta produk favorit mereka berdasarkan warna favorit mereka.

Untuk melakukan ini, mari hubungkan tabel secara berurutan berdasarkan warna Klien dengan meja Asosiasi dan kemudian (hasil yang dihasilkan) dengan tabel Makanan:

Ikuti tesnya

Mulai tes

1. Koneksi terbiasa

Sekarang mari kita lihat lebih dekat menggabungkan tabel.

Izinkan saya mengingatkan Anda bahwa ada beberapa jenis koneksi dalam bahasa query 1C8, yaitu: KONEKSI KIRI, BENAR BERGABUNG, GABUNG DALAM, KONEKSI LENGKAP. Mari kita lihat masing-masing secara detail.

  • KONEKSI KIRI

    Dalam kasus gabungan kiri, data dari satu tabel dipilih sepenuhnya, dan dari tabel yang digabungkan di sebelah kanan, hanya rekaman yang dipilih yang satu atau lebih kondisinya terpenuhi untuk menggabungkan tabel-tabel ini. Tentu saja hanya sedikit yang dapat dipahami dari kalimat ini, jadi mari kita lihat sebuah contoh.
    Ada tabel "Produk":

    Mari buat tabel ini di konsol kueri 1C menggunakan kueri berikut:

    PILIH "001" SEBAGAI Kode Produk, "Apel" SEBAGAI Nama GABUNGKAN SEMUA PILIH "002", "Jeruk" GABUNGKAN SEMUA PILIH "003", "Jeruk Keprok"

    Ada juga tabel “Negara” yang terlihat seperti ini:

    Kode Produk Negara
    001 Rusia
    002 Turki
    003 Maroko

    Kami juga akan membangunnya dengan query berikut:

    PILIH "001" SEBAGAI Kode Produk, "Rusia" SEBAGAI Negara GABUNGKAN SEMUA PILIH "002", "Turki" GABUNGKAN SEMUA PILIH "003", "Maroko"

    Sekarang mari kita hubungkan kedua tabel ini menggunakan gabungan kiri untuk mendapatkan tabel yang berisi kode produk, nama, dan negara. Untuk melakukan ini, kami akan menempatkan tabel kami di tabel sementara dan melakukan penggabungan kiri dalam kueri batch.

    Kami akan menghubungkan catatan, tentu saja, berdasarkan bidang Kode Produk

    PILIH "001" SEBAGAI Kode Produk, "Apel" SEBAGAI Nama TEMPAT VT_Produk GABUNGKAN SEMUA PILIH "002", "Jeruk" GABUNGKAN SEMUA PILIH "003", "Jeruk Keprok" ; ////////////////////////////////////////////////// // //////////////////////////// PILIH "001" SEBAGAI Kode Produk, "Rusia" SEBAGAI TEMPAT Negara VT_Country GABUNGKAN SEMUA PILIH "002" , " Turki" GABUNGKAN SEMUA PILIH "003", "Maroko" ; ////////////////////////////////////////////////// // /////////////////////////// PILIH VT_Product.Kode Produk, VT_Product.Name, VT_Country.Country DARI VT_Product SEBAGAI VT_Product SAMBUNGAN KIRI VT_Country SEBAGAI Perangkat Lunak VT_Country VT_Product .Kode Produk = VT_Negara.Kode Produk

    Anda dapat menyalin kode ini ke konsol kueri dan menjalankannya dan mendapatkan hasil ini:

    Di sini kita melihat situasi ideal di mana setiap entri di tabel kiri berhubungan dengan satu entri di tabel kanan. Mari kita membuatnya sedikit lebih rumit.

    Katakanlah kita mempunyai harga lebih untuk produk kita. Selain itu, mereka dapat berubah tergantung pada tanggal:

    Kode Produk tanggal Harga
    001 01.01.2016 120
    001 01.02.2016 150
    002 01.01.2016 200
    004 01.01.2016 350

    Di sini kita melihat bahwa untuk kode produk 001 (Apel) kita memiliki 2 entri di tabel harga. Tidak ada harga untuk jeruk keprok. Selain itu, pada harga terdapat kode produk 004 yang tidak terdapat pada tabel produk. Mari kita lakukan gabung kiri untuk produk dan harga dengan kondisi koneksi pada kolom kode dan lihat apa yang kita dapatkan.

    PILIH "001" SEBAGAI Kode Produk, "Apel" SEBAGAI Nama TEMPAT VT_Produk GABUNGKAN SEMUA PILIH "002", "Jeruk" GABUNGKAN SEMUA PILIH "003", "Jeruk Keprok" ; ////////////////////////////////////////////////// // /////////////////////////// PILIH "001" SEBAGAI Kode Produk, "01/01/2016" SEBAGAI Tanggal, 120 SEBAGAI TEMPAT Harga TU_Harga KOMBINASI SEMUA PILIH "001", "01/02/2016", 150 GABUNGKAN SEMUA PILIH "002", "01/01/2016", 200 GABUNGKAN SEMUA PILIH "004", "01/01/2016", 350 ; ////////////////////////////////////////////////// // ///////////////////////////// PILIH VT_Product.Kode Produk, VT_Product.Name, VT_Price.Price, VT_Price.Tanggal DARI VT_Product SEBAGAI VT_Product LEFT CONNECTION VT_Harga SEBAGAI VT_Harga OLEH VT_Produk.Kode Produk = VT_Harga.Kode Produk

    Setelah menjalankan permintaan, kita melihat gambar ini:

    Mari kita analisa hasilnya. Semua catatan dipilih dari tabel “Produk” karena itu yang utama kami. Untuk jeruk keprok harganya NULL, soalnya entri dengan kode 003 tidak ada di tabel harga. Dan entri dengan kode 004 dari tabel harga (dan itu tambahan bagi kami) diabaikan, karena tidak ada yang cocok untuk itu di tabel produk. Dan seperti yang bisa kita lihat, kita memiliki 2 record dengan apel, padahal di tabel produk hanya ada satu record dengan kode 001. Di sinilah letak beberapa bahaya dari table join.

    Dan baik pemula maupun pemrogram berpengalaman termasuk dalam kelompok ini. Jika terdapat satu record pada tabel utama, dan beberapa record pada tabel yang digabungkan memenuhi kondisi join, maka jumlah record pada tabel akhir akan sama dengan jumlah record pada tabel bantu. Dalam kasus kami, catatan dengan apel telah diduplikasi. Poin ini harus diperhitungkan saat menulis kueri dan diperiksa selama pengujian.

  • BENAR BERGABUNG

    Praktis tidak ada bedanya dengan yang kiri. Tabel terakhir mencakup semua catatan dari tabel kanan, dan dari tabel kiri hanya catatan yang kondisi gabungannya terpenuhi. Dalam praktiknya, gabungan yang tepat praktis tidak digunakan dan kami tidak akan mempertimbangkannya secara terpisah. Bahkan ada momen lucu kecil terkait hak bergabung di desainer kueri 1C. Jika Anda mencoba menggunakan gabung kanan saat membuat kueri di desainer, maka setelah mengklik OK, gabung kanan akan otomatis diubah menjadi gabung kiri.

  • GABUNG DALAM

    Dalam kasus gabungan internal, hanya rekaman dari tabel kiri dan kanan yang kondisi gabungannya terpenuhi yang akan muncul di tabel akhir. Jika pada query terakhir kita mengganti barisnya

    KONEKSI KIRI VT_Price SEBAGAI VT_Price

    KONEKSI INTERNAL VT_Price SEBAGAI VT_Price

    maka pada akhirnya kita mendapatkan:

    Artinya, entri kami dengan jeruk keprok telah hilang, karena... tidak ada tandingannya di tabel harga.

  • KONEKSI LENGKAP

    Dalam kasus gabungan penuh, tabel yang dihasilkan akan berisi semua catatan dari kedua tabel.
    Dalam kasus kami, saat menggunakan string koneksi

    KONEKSI LENGKAP BT_Price SEBAGAI BT_Price

    kita mendapatkan hasil sebagai berikut

    Dalam praktiknya, koneksi penuh jarang digunakan, namun terkadang diperlukan.

Bagi mereka yang baru mulai bekerja dengan permintaan 1C8, saya menyarankan Anda untuk melihat keduanya di tab “Koneksi”.

Bahasa kueri adalah salah satu mekanisme dasar 1C 8.3 untuk pengembang. Dengan menggunakan kueri, Anda dapat dengan cepat mengambil data apa pun yang disimpan dalam database. Sintaksnya sangat mirip dengan SQL, tetapi ada beberapa perbedaan.

Keuntungan utama bahasa kueri 1C 8.3 (8.2) dibandingkan SQL:

  • bidang referensi dereferensi (merujuk satu atau lebih titik ke detail objek);
  • bekerja dengan hasil sangat nyaman;
  • kemampuan untuk membuat tabel virtual;
  • permintaan dapat ditulis dalam bahasa Inggris dan Rusia;
  • kemampuan untuk memblokir data untuk menghindari kebuntuan.

Kekurangan bahasa query di 1C:

  • tidak seperti SQL, dalam kueri 1C tidak mengizinkan perubahan data;
  • kurangnya prosedur tersimpan;
  • ketidakmungkinan mengubah string menjadi angka.

Mari kita lihat tutorial mini kami tentang konstruksi dasar bahasa kueri 1C.

Karena kueri di 1C hanya memungkinkan Anda menerima data, kueri apa pun harus dimulai dengan kata "PILIH". Setelah perintah ini, bidang dari mana data harus diperoleh ditunjukkan. Jika Anda menentukan “*”, semua bidang yang tersedia akan dipilih. Tempat dari mana data akan dipilih (dokumen, register, direktori, dll.) ditunjukkan setelah kata “DARI”.

Dalam contoh yang dibahas di bawah ini, nama seluruh nomenklatur dipilih dari direktori “Nomenklatur”. Setelah kata “BAGAIMANA”, alias (nama) untuk tabel dan bidang ditunjukkan.

MEMILIH
Nomenklatur Nama SEBAGAI Nama Nomenklatur
DARI
Direktori.Nomenklatur SEBAGAI Tata Nama

Di samping perintah “PILIH” Anda dapat menentukan kata kunci:

  • BERMACAM-MACAM. Kueri hanya akan memilih baris yang berbeda setidaknya dalam satu bidang (tanpa duplikat).
  • N pertama, Di mana N– jumlah baris dari awal hasil yang perlu dipilih. Paling sering, konstruksi ini digunakan bersamaan dengan penyortiran (ORDER BY). Misalnya, ketika Anda perlu memilih sejumlah dokumen terbaru berdasarkan tanggal.
  • DIIZINKAN. Desain ini memungkinkan Anda untuk memilih dari database hanya catatan-catatan yang tersedia untuk pengguna saat ini. Berdasarkan penggunaan kata kunci ini, pengguna akan menerima pesan kesalahan saat mencoba menanyakan rekaman yang tidak dapat mereka akses.

Kata kunci ini dapat digunakan secara bersamaan atau terpisah.

UNTUK PERUBAHAN

Proposal ini memblokir data untuk mencegah konflik timbal balik. Data yang terkunci tidak akan dibaca dari koneksi lain hingga transaksi berakhir. Dalam klausa ini, Anda dapat menentukan tabel tertentu yang perlu dikunci. DI DALAM jika tidak semua orang akan diblokir. Desainnya hanya relevan untuk mode penguncian otomatis.

Paling sering, klausa “UNTUK PERUBAHAN” digunakan saat menerima saldo. Lagi pula, ketika beberapa pengguna mengerjakan program secara bersamaan, sementara yang satu menerima saldo, yang lain dapat mengubahnya. Dalam hal ini, sisa yang dihasilkan tidak lagi benar. Jika Anda memblokir data dengan proposal ini, maka hingga karyawan pertama menerima saldo yang benar dan melakukan semua manipulasi yang diperlukan dengannya, karyawan kedua akan terpaksa menunggu.

MEMILIH
Penyelesaian bersama Karyawan,
Penyelesaian bersama Jumlah penyelesaian bersama Saldo
DARI
Daftar Akumulasi Penyelesaian bersama dengan karyawan Saldo SEBAGAI Penyelesaian bersama
UNTUK PERUBAHAN

DI MANA

Perancangan diperlukan untuk memaksakan semacam seleksi pada data yang diunggah. Dalam beberapa kasus memperoleh data dari register, lebih masuk akal untuk menentukan kondisi pemilihan dalam parameter tabel virtual. Saat menggunakan "WHERE", semua catatan diambil terlebih dahulu, dan baru kemudian pemilihan diterapkan, yang secara signifikan memperlambat kueri.

Di bawah ini adalah contoh permintaan untuk mendapatkan contact person untuk posisi tertentu. Parameter pemilihan memiliki format: &NamaParameter (nama parameter dapat berubah-ubah).

SELEKSI (KASUS)

Desainnya memungkinkan Anda menentukan kondisi langsung di isi permintaan.

Pada contoh di bawah, “Bidang Tambahan” akan berisi teks tergantung pada apakah dokumen tersebut diposting atau tidak:

MEMILIH
PenerimaanT&U.Link,
PILIHAN
KAPAN PenerimaanT&U.Dilakukan
LALU “Dokumennya sudah disahkan!”
LAINNYA “Dokumen itu tidak diposting...”
AKHIR SEBAGAI Bidang Tambahan
DARI
Dokumen Penerimaan Barang dan Jasa CARA S&K Penerimaan

BERGABUNG

Menggabungkan tautan dua tabel berdasarkan kondisi hubungan tertentu.

KONEKSI KIRI/KANAN

Inti dari gabungan KIRI adalah bahwa tabel pertama yang ditentukan diambil secara keseluruhan dan tabel kedua ditautkan sesuai dengan kondisi koneksi. Jika tidak ada record yang sesuai dengan tabel pertama di tabel kedua, maka NULL diganti sebagai nilainya. Sederhananya, tabel utama adalah tabel pertama yang ditentukan dan data tabel kedua (jika ada) sudah menggantikan datanya.

Misalnya, perlu untuk memperoleh item barang dari dokumen “Penerimaan barang dan jasa” dan harga dari daftar informasi “Harga barang”. Dalam hal ini, jika harga untuk posisi apa pun tidak ditemukan, gantikan dengan NULL. Semua item dari dokumen akan dipilih terlepas dari apakah item tersebut memiliki harga atau tidak.

MEMILIH
Kwitansi & Nomenklatur U,
Harga.Harga
DARI
Dokumen Kwitansi Barang dan Jasa Barang CARA Kwitansi S&K
INTERNAL GABUNG DaftarInformasi.HargaNomenklatur.IrisanHarga AS Terakhir
Tanda Terima Perangkat Lunak&U.Nomenklatur = Harga.Nomenklatur

DI DALAM BENAR semuanya justru sebaliknya.

KONEKSI LENGKAP

Jenis koneksi ini berbeda dari yang sebelumnya karena semua rekaman tabel pertama dan tabel kedua akan dikembalikan. Jika tidak ada catatan yang ditemukan di tabel pertama atau kedua berdasarkan kondisi tautan yang ditentukan, NULL akan dikembalikan.

Saat menggunakan koneksi penuh pada contoh sebelumnya, semua item barang dari dokumen “Kwitansi Barang dan Jasa” dan semua harga terbaru dari daftar “Harga Barang” akan dipilih. Nilai record yang tidak ditemukan pada tabel pertama dan kedua akan sama dengan NULL.

GABUNG DALAM

Perbedaan antara INNER JOIN dan FULL JOIN adalah jika record tidak ditemukan di setidaknya satu tabel, query tidak akan menampilkannya sama sekali. Akibatnya, hanya item-item tersebut dari dokumen “Kwitansi Barang dan Jasa” yang akan dipilih yang terdapat catatan dalam register informasi “Harga Barang”, jika pada contoh sebelumnya kita mengganti “FULL” dengan “INTERNAL”.

KELOMPOK OLEH

Pengelompokan dalam kueri 1C memungkinkan Anda untuk menciutkan baris tabel (mengelompokan bidang) menurut spesifik fitur umum(bidang yang dikelompokkan). Bidang pengelompokan hanya dapat ditampilkan menggunakan fungsi agregat.

Hasil dari query berikut akan berupa daftar jenis produk dengan harga maksimumnya.

MEMILIH
,
MAX(Harga.Harga) SEBAGAI Harga
DARI

KELOMPOK OLEH
Harga.Nomenklatur.Jenis Nomenklatur

HASIL

Tidak seperti pengelompokan, saat menggunakan total, semua catatan ditampilkan dan total baris ditambahkan ke dalamnya. Pengelompokan hanya menampilkan catatan umum.

Hasil dapat diringkas untuk seluruh tabel (menggunakan kata kunci “UMUM”), untuk beberapa bidang, untuk bidang dengan struktur hierarki (kata kunci “HIERARCHY”, “HANYA HIERARCHY”). Saat merangkum hasil, tidak perlu menggunakan fungsi agregat.

Mari kita lihat contoh serupa dengan contoh di atas menggunakan pengelompokan. Dalam hal ini, hasil kueri tidak hanya akan mengembalikan bidang yang dikelompokkan, tetapi juga catatan terperinci.

MEMILIH
Harga.Nomenklatur.Jenis Nomenklatur SEBAGAI Jenis Nomenklatur,
Harga.Harga SEBAGAI Harga
DARI
Daftar Informasi Harga Nomenklatur Cuplikan Harga AS Terbaru
HASIL
MAKSIMUM (Harga)
OLEH
JenisNomenklatur

MEMILIKI

Operator ini mirip dengan operator WHERE, namun hanya digunakan untuk fungsi agregat. Bidang lainnya, kecuali yang digunakan oleh operator ini, harus dikelompokkan. Operator WHERE tidak berlaku untuk fungsi agregat.

Pada contoh di bawah, harga maksimum suatu barang dipilih jika melebihi 1000, dikelompokkan berdasarkan jenis barang.

MEMILIH

MAX(Harga.Harga) SEBAGAI Harga
DARI
Daftar Informasi Harga Nomenklatur Cuplikan Harga AS Terbaru
KELOMPOK OLEH
Harga.Nomenklatur.Jenis Nomenklatur
MEMILIKI
MAKSIMUM(Harga.Harga) > 1000

SORTIR DENGAN

Operator ORDER BY mengurutkan hasil kueri. Untuk memastikan bahwa catatan ditampilkan dalam urutan yang konsisten, AUTO ORDER digunakan. Tipe primitif diurutkan menurut aturan biasa. Jenis referensi diurutkan berdasarkan GUID.

Contoh mengurutkan daftar karyawan berdasarkan nama:

MEMILIH
Karyawan.Nama SEBAGAI Nama
DARI
Direktori.Karyawan BAGAIMANA Karyawan
SORTIR DENGAN
Nama
PESANAN OTOMATIS

Konstruksi bahasa kueri 1C lainnya

  • MENGGABUNGKAN– hasil dari dua pertanyaan menjadi satu.
  • GABUNGKAN SEMUANYA– mirip dengan COMBINE, tetapi tanpa mengelompokkan baris yang identik.
  • MEJA KOSONG– terkadang digunakan saat menggabungkan kueri untuk menentukan tabel bersarang yang kosong.
  • TEMPAT– membuat tabel sementara untuk mengoptimalkan kueri 1C yang kompleks. Permintaan seperti ini disebut permintaan batch.

Fitur Bahasa Kueri

  • SUBSTRING memotong string dari posisi tertentu ke sejumlah karakter tertentu.
  • TAHUN... KEDUA memungkinkan Anda mendapatkan nilai yang dipilih dari tipe numerik. Parameter masukannya adalah tanggal.
  • AWAL PERIODE dan AKHIR PERIODE digunakan saat bekerja dengan tanggal. Jenis periode (HARI, BULAN, TAHUN, dll.) ditunjukkan sebagai parameter tambahan.
  • TAMBAHKAN TANGGAL memungkinkan Anda menambah atau mengurangi waktu tertentu dari jenis tertentu dari suatu tanggal (DETIK, MENIT, HARI, dll.).
  • TANGGAL PERBEDAAN menentukan perbedaan antara dua tanggal, menunjukkan jenis nilai keluaran (HARI, TAHUN, BULAN, dll.).
  • TIDAK BOLEH mengganti nilai yang hilang dengan ekspresi yang ditentukan.
  • REPRESENTASI dan REPRESENTASILINK dapatkan representasi string dari bidang yang ditentukan. Berlaku masing-masing untuk nilai apa pun dan hanya nilai referensi.
  • JENIS, JENIS NILAI digunakan untuk menentukan jenis parameter input.
  • TAUTAN adalah operator perbandingan logis untuk tipe nilai atribut.
  • CEPAT digunakan untuk mengonversi nilai ke tipe yang diinginkan.
  • TANGGAL WAKTU mendapat nilai bertipe "Tanggal" dari nilai numerik (Tahun, Bulan, Hari, Jam, Menit, Detik).
  • ARTI dalam permintaan 1C, ini digunakan untuk menunjukkan nilai yang telah ditentukan sebelumnya - direktori, enumerasi, rencana untuk jenis karakteristik. Contoh penggunaan: " Dimana Perorangan Hukum = Nilai(Pencacahan. Perorangan Hukum. Perorangan)«.

Pembuat Kueri

Untuk membuat kueri dengan 1C, terdapat mekanisme bawaan yang sangat nyaman - perancang kueri. Ini berisi tab utama berikut:

  • “Tabel dan Bidang” - berisi bidang yang perlu dipilih dan sumbernya.
  • "Koneksi" - menjelaskan kondisi struktur KONEKSI.
  • “Pengelompokan”—berisi deskripsi struktur pengelompokan dan jumlah bidang berdasarkan struktur tersebut.
  • "Kondisi" - bertanggung jawab untuk memilih data dalam permintaan.
  • "Tambahan" - Opsi tambahan permintaan, seperti kata kunci dari perintah “PILIH”, dll.
  • “Gabungan/Alias” - kemungkinan penggabungan tabel ditunjukkan dan alias ditentukan (konstruksi “BAGAIMANA”).
  • "Order" bertanggung jawab untuk mengurutkan hasil kueri.
  • "Total" - mirip dengan tab "Pengelompokan", tetapi digunakan untuk konstruksi "TOTAL".

Teks permintaan itu sendiri dapat dilihat dengan mengklik tombol “Permintaan” di pojok kiri bawah. Dalam formulir ini, dapat dikoreksi secara manual atau disalin.


Konsol Permintaan

Untuk melihat dengan cepat hasil kueri dalam mode Perusahaan, atau men-debug kueri kompleks, gunakan . Ini berisi teks permintaan, menetapkan parameter, dan menampilkan hasilnya.

Anda dapat mengunduh konsol kueri pada disk ITS, atau melalui .

Gabungan adalah salah satu operasi paling umum yang dilakukan pada database. Gabungan digunakan untuk mencocokkan baris dari satu tabel ke baris di tabel lainnya. Pencocokan dibuat berdasarkan nilai salah satu bidang, yang akan kita sebut kunci.

Pada dasarnya koneksi digunakan untuk memperoleh informasi dari berbagai sumber dalam satu sampel. Dengan kata lain, sumber-sumber terhubung ketika makna fisiknya berbeda.

Ada empat jenis gabungan tabel yang diproses oleh mesin kueri 1C:Enterprises: Internal, Left Outer. Eksternal Kanan, Eksternal Penuh (atau, lebih sederhananya, Internal, Kiri, Kanan, Penuh).

Gabungan batin

[INTERNAL] JOIN berarti dari kedua tabel sumber - sumber data, hanya kombinasi record yang memenuhi kondisi yang ditentukan yang harus dimasukkan dalam hasil kueri. Catatan yang tersisa tidak disertakan dalam hasil. Kata kunci INTERNAL dapat dihilangkan sama sekali; ini meningkatkan kejelasan dan keterbacaan teks kueri.

Jenis koneksi paling sederhana adalah internal. Dalam hal ini, kueri hanya menemukan pasangan baris dengan nilai kunci yang cocok (dalam contoh ini, seperti pada semua contoh berikutnya, bidang “Akun” digunakan sebagai bidang kunci).

Koneksi Kiri (Kanan).

LEFT [OUTER] JOIN berarti hasil kueri harus menyertakan kombinasi rekaman dari kedua tabel sumber yang memenuhi kondisi yang ditentukan. Namun, tidak seperti gabungan internal, hasil kueri juga harus menyertakan rekaman dari sumber pertama (ditunjukkan di sebelah kiri kata GABUNG) yang tidak ditemukan rekaman dari sumber kedua yang cocok dengan kondisi tersebut. Dengan cara ini, hasil kueri akan mencakup semua catatan dari sumber pertama; mereka akan digabungkan dengan catatan dari sumber kedua jika kondisi yang ditentukan terpenuhi. Baris hasil kueri yang tidak ditemukan catatan dari sumber kedua yang cocok dengan kondisi akan berisi NULL di bidang yang dihasilkan berdasarkan catatan dari sumber ini.

Situasi menjadi lebih rumit ketika sumber-sumbernya tidak sepenuhnya cocok. 'Jadi, di satu tabel ada record dengan nilai kunci tertentu, tapi di tabel lain tidak ada record seperti itu. Diagram menunjukkan situasi ketika entri ada di tabel rekanan, tapi tidak di tabel penjualan. Ini berarti bahwa rekanan tertentu tidak membeli apa pun dari kami, meskipun kami memilikinya di direktori rekanan (misalnya, seseorang meminta untuk menulis faktur pembayaran kepadanya, tetapi berubah pikiran tentang pembelian; situasi kehidupan nyata ). Dalam hal ini, nilai Null akan muncul di pilihan sebagai pengganti record yang hilang.

Tabel sumber:

Koneksi penuh

GABUNG [LUAR] KANAN berarti hasil kueri harus menyertakan kombinasi rekaman dari kedua tabel sumber yang memenuhi kondisi tertentu. Selain itu, hasil kueri juga harus menyertakan rekaman dari sumber kedua (ditunjukkan di sebelah kanan kata CONNECTION) yang tidak ditemukan rekaman terkait dari sumber pertama.Dengan demikian, hasil kueri akan menyertakan semua rekaman dari sumber kedua; mereka akan digabungkan dengan catatan dari sumber pertama jika kondisi yang ditentukan terpenuhi. Baris hasil kueri yang tidak ditemukan catatan dari sumber pertama yang cocok dengan kondisi akan berisi NULL di bidang yang dihasilkan berdasarkan catatan dari sumber ini.

Gabungan luar penuh, seperti namanya, merupakan pengembangan lebih lanjut dari gabungan Kiri (atau Kanan). Saat mengatur gabungan penuh, penting untuk mempertimbangkan keadaan ini: saat menggabungkan jenis ini, semua catatan dari kedua tabel disertakan dalam kueri. Dengan kata lain, kita perlu mendapatkan nilai nol kunci dari tabel kiri dan kanan. Harap diperhatikan: harus dari kedua tabel! Salah satu solusinya adalah ini: buat kolom tambahan untuk ini, di mana Anda memeriksa Null. Jika kunci di salah satu tabel adalah Null, maka Anda perlu mengambil nilainya dari tabel lain.

Karena gabungan penuh agak lebih kompleks dibandingkan jenis gabungan lainnya, mari kita ubah sedikit contoh kita. Sekarang kita tidak hanya perlu mendapatkan daftar penjualan yang terperinci, tetapi juga daftar semua rekanan yang ada.

Tabel sumber:

Pengadaan
Pihak rekanan Jumlah
Ivanov 4000
Andreev 3500
Penjualan
Pihak rekanan Jumlah
Ivanov 5000
Petrov 7500
Sidorov 15000

Tabel setelah gabungan penuh, dengan semua bidang tabel asli:

Pihak lawan saat ini
Pembelian Pihak Lawan Jumlah Pembelian Penjualan Counterparty Jumlah Penjualan
Ivanov 4000 Ivanov 5000
Batal Batal Petrov 7500
Batal Batal Sidorov 15000
Andreev 3500 Batal Batal

Tampilan akhir tabel, yang merangkum rekanan dalam satu bidang:

Pihak lawan saat ini
Pihak rekanan Jumlah Pembelian Jumlah Penjualan
Ivanov 4000 5000
Petrov 7500
Sidorov 15000
Andreev 3500

Di bawah ini adalah varian dari permintaan terkait. Harap dicatat bahwa kami memperoleh data rekanan tidak hanya dari dokumen, tetapi dari subkueri. Di dalamnya, kami melakukan pengelompokan berdasarkan rekanan sedemikian rupa sehingga setiap rekanan terwakili dalam sampel tetapi hanya satu kali. Dan tentu saja, jangan lupakan Null:

PILIH ISNULL(Receipt.Counterparty.Expense.Counterparty) SEBAGAI Counterparty, ISNULL(Receipt.Amount, 0) SEBAGAI AmountPurchases, ECTБNULL(Pacxod.Amount, 0) SEBAGAI AmountSales FROM (SELECT Receipt.Counterparty SEBAGAI Counterparty, AMOUNT(Receipt.Amount) SEBAGAI Jumlah DARI Dokumen.Penerimaan SEBAGAI KELOMPOK Kwitansi BERDASARKAN Kwitansi.Counterparty) SEBAGAI Kwitansi KONEKSI LENGKAP (PILIH Pengeluaran.Counterparty SEBAGAI Counterparty, JUMLAH(Beban.Jumlah) SEBAGAI Jumlah DARI Dokumen.Beban SEBAGAI Pengeluaran KELOMPOK BERDASARKAN Pengeluaran.Counterparty) SEBAGAI Pengeluaran BERDASARKAN Kwitansi .Counterparty = Biaya.Counterparty

Pilihan Editor
Terakhir diperbarui: 23/08/2017 pukul 17:01 Penyelam Armada Pasifik dan peneliti Masyarakat Geografis Rusia sedang mempersiapkan...

Abstrak penerbit: Buku ini menjelaskan operasi tempur kapal selam Amerika dalam Perang Dunia Kedua, terutama di...

Pada tahun 2009, Komisi di bawah Presiden Federasi Rusia untuk modernisasi dan pengembangan teknologi ekonomi Rusia memutuskan untuk...

Para bartender berpengalaman mengklaim bahwa koktail Depth Bomb meledak tiga kali: pertama di gelas selama persiapan, kemudian di mulut saat...
Mungkin tidak ada kota di dunia yang begitu erat kaitannya dengan berbagai harapan dan harapan selain New York. Patung Terkenal...
Suka atau tidak suka, Rusia sedang berintegrasi ke dalam pasar kapal bersama. Bagi pecinta rekreasi air, bagus...
Dan kecepatan. Satuan pengukuran mungkin sulit dipahami oleh orang non-laut, sehingga menentukan jarak dan kecepatan...
Es laut diklasifikasikan: berdasarkan asal, berdasarkan bentuk dan ukuran, berdasarkan kondisi permukaan es (datar, hummocky), berdasarkan umur...
Ketabahan yang menguntungkan. Kekuatan di jari kaki Anda. - Kampanye - sayangnya, memiliki kebenaran. Ketabahan - untungnya. Orang yang tidak penting harus...