รวมผลการสืบค้น รวมผลการสืบค้น วิธีรวมการสืบค้นเป็น 1 วินาที

ภาษาแบบสอบถามเป็นหนึ่งในกลไกพื้นฐานของ 1C 8.3 สำหรับนักพัฒนา ด้วยความช่วยเหลือของแบบสอบถาม คุณสามารถรับข้อมูลใด ๆ ที่จัดเก็บไว้ในฐานข้อมูลได้อย่างรวดเร็ว ไวยากรณ์ของมันคล้ายกับ SQL มาก แต่มีความแตกต่างบางประการ

ข้อได้เปรียบหลักของภาษาเคียวรี 1C 8.3 (8.2) บน SQL:

  • การอ้างอิงเขตข้อมูลอ้างอิง (เปลี่ยนหนึ่งจุดขึ้นไปเป็นแอตทริบิวต์ของวัตถุ);
  • การทำงานกับผลลัพธ์นั้นสะดวกมาก
  • ความสามารถในการสร้างตารางเสมือน
  • คำขอสามารถเขียนได้ทั้งภาษาอังกฤษและภาษารัสเซีย
  • ความสามารถในการบล็อกข้อมูลเพื่อหลีกเลี่ยงการหยุดชะงัก

ข้อเสียของภาษาแบบสอบถามใน 1C:

  • ซึ่งแตกต่างจาก SQL ในแบบสอบถาม 1C ไม่อนุญาตให้คุณเปลี่ยนข้อมูล
  • ขาดขั้นตอนการจัดเก็บ
  • ความเป็นไปไม่ได้ในการแปลงสตริงเป็นตัวเลข

พิจารณาบทช่วยสอนขนาดเล็กของเราเกี่ยวกับการสร้างพื้นฐานของภาษาคิวรี 1C

เนื่องจากคำขอใน 1C อนุญาตให้คุณรับข้อมูลได้เท่านั้น คำขอใด ๆ จะต้องขึ้นต้นด้วยคำว่า "SELECT" หลังจากคำสั่งนี้ ฟิลด์ที่คุณต้องการรับข้อมูลจะถูกระบุ หากคุณระบุ "*" ช่องที่มีอยู่ทั้งหมดจะถูกเลือก สถานที่ที่จะเลือกข้อมูล (เอกสาร ทะเบียน ไดเร็กทอรี ฯลฯ) จะถูกระบุหลังคำว่า "FROM"

ในตัวอย่างด้านล่าง ชื่อของระบบการตั้งชื่อทั้งหมดจะถูกเลือกจากหนังสืออ้างอิง "ระบบการตั้งชื่อ" หลังจากคำว่า "HOW" จะมีการระบุนามแฝง (ชื่อ) สำหรับตารางและฟิลด์

เลือก
Nomenclature.Name AS NameNomenclature
จาก
สารบบ. ระบบการตั้งชื่อ AS ระบบการตั้งชื่อ

ถัดจากคำสั่ง "SELECT" คุณสามารถระบุคำสำคัญ:

  • หลากหลาย. แบบสอบถามจะเลือกเฉพาะแถวที่แตกต่างกันอย่างน้อยหนึ่งฟิลด์ (โดยไม่ซ้ำกัน)
  • ครั้งแรก, ที่ไหน – จำนวนแถวจากจุดเริ่มต้นของผลลัพธ์ที่จะเลือก บ่อยครั้งที่โครงสร้างนี้ใช้ร่วมกับการเรียงลำดับ (ORDER BY) ตัวอย่างเช่น เมื่อคุณต้องการเลือกเอกสารล่าสุดจำนวนหนึ่งตามวันที่
  • อนุญาต. การออกแบบนี้อนุญาตให้คุณเลือกจากฐานข้อมูลเฉพาะเรคคอร์ดที่มีให้สำหรับผู้ใช้ปัจจุบัน หากใช้คีย์เวิร์ดนี้ ผู้ใช้จะได้รับข้อความแสดงข้อผิดพลาดหากพยายามค้นหาเรกคอร์ดที่ไม่สามารถเข้าถึงได้

คำหลักเหล่านี้สามารถใช้ร่วมกันหรือแยกกันได้

เพื่อการเปลี่ยนแปลง

ข้อนี้ล็อคข้อมูลเพื่อหลีกเลี่ยงความขัดแย้ง ข้อมูลที่ถูกล็อคจะไม่ถูกอ่านจากการเชื่อมต่ออื่นจนกว่าจะสิ้นสุดการทำธุรกรรม ในข้อนี้ คุณสามารถระบุตารางเฉพาะที่คุณต้องการล็อกได้ มิฉะนั้นจะถูกบล็อกทั้งหมด การออกแบบเกี่ยวข้องกับโหมดการปิดกั้นอัตโนมัติเท่านั้น

ส่วนใหญ่มักใช้คำสั่ง "FOR CHANGE" เมื่อได้รับยอดคงเหลือ เมื่อผู้ใช้หลายคนทำงานในโปรแกรมพร้อมกัน ในขณะที่คนหนึ่งได้รับยอดคงเหลือ อีกคนสามารถเปลี่ยนได้ ในกรณีนี้ ยอดคงเหลือที่ได้จะไม่ถูกต้องอีกต่อไป หากคุณบล็อกข้อมูลด้วยข้อเสนอนี้ จนกว่าพนักงานคนแรกจะได้รับยอดคงเหลือที่ถูกต้องและดำเนินการจัดการที่จำเป็นทั้งหมด พนักงานคนที่สองจะต้องรอ

เลือก
การตั้งถิ่นฐานร่วมกัน พนักงาน
การตั้งถิ่นฐานร่วมกัน จำนวนเงิน การชำระหนี้ร่วมกัน ยอดคงเหลือ
จาก
ทะเบียนสะสม การตกลงร่วมกันกับพนักงาน ยอดคงเหลือ AS การชำระบัญชีร่วมกัน
เพื่อการเปลี่ยนแปลง

ที่ไหน

การก่อสร้างเป็นสิ่งจำเป็นสำหรับการกำหนดการเลือกใด ๆ กับข้อมูลที่ไม่ได้โหลด ในบางกรณีของการได้รับข้อมูลจากรีจิสเตอร์ การกำหนดเงื่อนไขการเลือกในพารามิเตอร์ของตารางเสมือนนั้นเหมาะสมกว่า เมื่อใช้ "WHERE" ระเบียนทั้งหมดจะได้รับก่อน จากนั้นจะใช้การเลือกเท่านั้น ซึ่งจะทำให้การสืบค้นช้าลงอย่างมาก

ต่อไปนี้คือตัวอย่างคำขอรับผู้ติดต่อกับตำแหน่งเฉพาะ พารามิเตอร์การเลือกมีรูปแบบดังต่อไปนี้: &ParameterName (ชื่อพารามิเตอร์เป็นชื่อที่กำหนดเองได้)

การเลือก (กรณี)

โครงสร้างช่วยให้คุณสามารถระบุเงื่อนไขได้โดยตรงในเนื้อหาคำขอ

ในตัวอย่างด้านล่าง "ฟิลด์เพิ่มเติม" จะมีข้อความขึ้นอยู่กับว่ามีการโพสต์เอกสารหรือไม่:

เลือก
AdmissionT&U.Link,
ทางเลือก
เมื่อไร
แล้ว "เอกสารโพสต์!"
อื่น "ไม่ได้โพสต์เอกสาร..."
สิ้นสุดเป็นฟิลด์เพิ่มเติม
จาก
เอกสารการรับสินค้าบริการ AS ReceiptT&C

เข้าร่วม

รวมลิงก์สองตารางตามเงื่อนไขลิงก์ที่กำหนด

เข้าร่วมซ้าย / ขวา

สาระสำคัญของการรวม LEFT คือตารางที่ระบุแรกนั้นถูกนำมาใช้อย่างสมบูรณ์และตารางที่สองจะถูกแนบตามเงื่อนไขของการเชื่อมต่อ หากไม่มีระเบียนที่ตรงกับตารางแรกในตารางที่สอง ค่า NULL จะถูกแทนที่ด้วยค่า พูดง่ายๆ คือ ตารางหลักคือตารางแรกที่ระบุ และข้อมูลของตารางที่สอง (ถ้ามี) จะถูกแทนที่ด้วยข้อมูลแล้ว

ตัวอย่างเช่น คุณต้องรับรายการสินค้าจากเอกสาร "การรับสินค้าและบริการ" และราคาจากการลงทะเบียนข้อมูล "ราคาสินค้า" ในกรณีนี้ หากไม่พบราคาของตำแหน่งใดๆ ให้แทนที่ NULL แทน รายการทั้งหมดจากเอกสารจะถูกเลือกไม่ว่าจะมีราคาหรือไม่ก็ตาม

เลือก
ใบเสร็จรับเงินของ T&U ระบบการตั้งชื่อ
ราคาราคา
จาก
เอกสารการรับสินค้าบริการสินค้าเป็นใบเสร็จรับเงินT&C
เข้าร่วมภายใน
ON การรับ Q&A.Nomenclature = ราคา.Nomenclature

ในทางขวา ทุกอย่างตรงกันข้าม

การเชื่อมต่อเต็มรูปแบบ

การรวมประเภทนี้แตกต่างจากก่อนหน้านี้ตรงที่เร็กคอร์ดทั้งหมดของทั้งตารางแรกและตารางที่สองจะถูกส่งกลับเป็นผลลัพธ์ หากไม่พบระเบียนในตารางแรกหรือตารางที่สองสำหรับเงื่อนไขลิงก์ที่ระบุ ระบบจะส่งคืนค่า NULL แทน

เมื่อใช้การรวมแบบเต็มในตัวอย่างก่อนหน้านี้ รายการสินค้าทั้งหมดจากเอกสารการรับสินค้าและบริการและราคาล่าสุดทั้งหมดจากการลงทะเบียนราคาสินค้าจะถูกเลือก ค่าของระเบียนที่ไม่พบทั้งในตารางแรกและตารางที่สองจะเป็น NULL

เข้าร่วมภายใน

ข้อแตกต่างระหว่างการรวม INNER และการรวมแบบเต็มคือ หากไม่พบเรกคอร์ดในตารางอย่างน้อยหนึ่งตาราง แบบสอบถามจะไม่แสดงเลย ด้วยเหตุนี้ จะมีการเลือกเฉพาะรายการสินค้าเหล่านั้นจากเอกสารการรับสินค้าและบริการซึ่งมีรายการอยู่ในการลงทะเบียนข้อมูลราคาสินค้า หากในตัวอย่างก่อนหน้านี้ เราแทนที่ FULL ด้วย INTERNAL

กลุ่มโดย

การจัดกลุ่มในแบบสอบถาม 1C ช่วยให้คุณสามารถยุบแถวของตาราง (ฟิลด์การจัดกลุ่ม) ตามคุณลักษณะทั่วไปบางอย่าง (ฟิลด์การจัดกลุ่ม) ฟิลด์การจัดกลุ่มสามารถแสดงได้โดยใช้ฟังก์ชันรวมเท่านั้น

ผลลัพธ์ของการค้นหาถัดไปจะเป็นรายการประเภทรายการที่มีราคาสูงสุด

เลือก
,
MAX(ราคา.ราคา) AS ราคา
จาก

กลุ่มโดย
ราคาการตั้งชื่อประเภทการตั้งชื่อ

ผลลัพธ์

ซึ่งแตกต่างจากการจัดกลุ่ม เมื่อใช้ผลรวม ระเบียนทั้งหมดจะแสดงขึ้นและแถวทั้งหมดจะถูกเพิ่มเข้าไปแล้ว การจัดกลุ่มจะแสดงเฉพาะเรกคอร์ดทั่วไปเท่านั้น

สามารถสรุปผลลัพธ์สำหรับตารางทั้งหมด (โดยใช้คำหลัก "ทั่วไป") สำหรับหลายฟิลด์ สำหรับฟิลด์ที่มีโครงสร้างแบบลำดับชั้น (คำหลัก "ลำดับชั้น", "ลำดับชั้นเท่านั้น") เมื่อสรุปแล้วไม่จำเป็นต้องใช้ฟังก์ชันรวม

พิจารณาตัวอย่างที่คล้ายกับตัวอย่างด้านบนโดยใช้การจัดกลุ่ม ในกรณีนี้ ผลการสืบค้นจะไม่เพียงส่งคืนฟิลด์ที่จัดกลุ่มเท่านั้น แต่ยังส่งบันทึกโดยละเอียดอีกด้วย

เลือก
ราคา การตั้งชื่อ ประเภทของระบบการตั้งชื่อ AS ประเภทของระบบการตั้งชื่อ
ราคาราคา AS ราคา
จาก
RegisterInformation.PricesNomenclature.SliceLast AS ราคา
ผลลัพธ์
สูงสุด (ราคา)
โดย
ประเภท การตั้งชื่อ

มี

ตัวดำเนินการนี้คล้ายกับตัวดำเนินการ WHERE แต่ใช้สำหรับฟังก์ชันรวมเท่านั้น ต้องจัดกลุ่มฟิลด์อื่นนอกเหนือจากที่ใช้โดยโอเปอเรเตอร์นี้ ตัวดำเนินการ "WHERE" ใช้ไม่ได้กับฟังก์ชันรวม

ในตัวอย่างด้านล่าง ราคาสินค้าสูงสุดจะถูกเลือกหากเกิน 1,000 โดยจัดกลุ่มตามประเภทสินค้า

เลือก

MAX(ราคา.ราคา) AS ราคา
จาก
RegisterInformation.PricesNomenclature.SliceLast AS ราคา
กลุ่มโดย
ราคาการตั้งชื่อประเภทการตั้งชื่อ
มี
MAX(ราคา.ราคา) > 1,000

จัดเรียงตาม

ตัวดำเนินการ "ORDER BY" จัดเรียงผลลัพธ์การค้นหา เพื่อให้แน่ใจว่าระเบียนส่งออกตามลำดับที่สอดคล้องกัน จึงใช้ AUTO-ORDER ประเภทดั้งเดิมถูกจัดเรียงตามกฎปกติ ประเภทการอ้างอิงจัดเรียงตาม GUID

ตัวอย่างการรับรายชื่อพนักงานเรียงตามชื่อ:

เลือก
ชื่อพนักงาน AS Name
จาก
Directory. พนักงาน AS พนักงาน
จัดเรียงตาม
ชื่อ
การสั่งซื้ออัตโนมัติ

โครงสร้างอื่น ๆ ของภาษาแบบสอบถาม 1C

  • รวมกัน- ผลลัพธ์ของสองแบบสอบถามในหนึ่งเดียว
  • รวมกันทั้งหมด– คล้ายกับ JOIN แต่ไม่มีการจัดกลุ่มแถวที่เหมือนกัน
  • โต๊ะว่าง- บางครั้งใช้เมื่อเข้าร่วมแบบสอบถามเพื่อระบุตารางที่ซ้อนกันว่างเปล่า
  • ใส่- สร้างตารางชั่วคราวเพื่อเพิ่มประสิทธิภาพการสืบค้น 1C ที่ซับซ้อน คำขอดังกล่าวเรียกว่าคำขอเป็นชุด

คุณสมบัติภาษาแบบสอบถาม

  • สตริงย่อยตัดทอนสตริงจากตำแหน่งที่ระบุตามจำนวนอักขระที่ระบุ
  • ปี…วินาทีช่วยให้คุณได้รับค่าที่เลือกของประเภทตัวเลข พารามิเตอร์อินพุตคือวันที่
  • จุดเริ่มต้นของช่วงเวลาและจุดสิ้นสุดของช่วงเวลาใช้เมื่อทำงานกับวันที่ ประเภทระยะเวลา (วัน เดือน ปี ฯลฯ) ถูกระบุเป็นพารามิเตอร์เพิ่มเติม
  • เพิ่มให้คุณเพิ่มหรือลบวันที่และเวลาที่ระบุของประเภทใดประเภทหนึ่ง (วินาที นาที วัน ฯลฯ)
  • ความแตกต่างของวันที่กำหนดความแตกต่างระหว่างวันที่สองวัน โดยระบุประเภทของค่าเอาต์พุต (วัน ปี เดือน ฯลฯ)
  • อิสนุลแทนที่ค่าที่หายไปด้วยนิพจน์ที่ระบุ
  • การนำเสนอและลิงก์การนำเสนอรับการแสดงสตริงของฟิลด์ที่ระบุ ใช้สำหรับค่าใด ๆ และเฉพาะค่าอ้างอิงตามลำดับ
  • ประเภท ประเภทมูลค่าใช้เพื่อกำหนดประเภทของพารามิเตอร์อินพุต
  • ลิงค์เป็นตัวดำเนินการเปรียบเทียบเชิงตรรกะสำหรับประเภทค่าแอตทริบิวต์
  • ด่วนใช้ในการแปลงค่าเป็นประเภทที่ต้องการ
  • วันเวลารับค่าประเภท "วันที่" จากค่าตัวเลข (ปี เดือน วัน ชั่วโมง นาที วินาที)
  • ความหมายในคำขอ 1C ใช้เพื่อระบุค่าที่กำหนดไว้ล่วงหน้า - ไดเร็กทอรี, การแจงนับ, แผนสำหรับประเภทของคุณสมบัติ ตัวอย่างการใช้งาน: " โดยที่ LegalIndividual = Value(Enumeration.LegalIndividual.Individual)«.

ตัวสร้างแบบสอบถาม

ในการสร้างแบบสอบถามด้วย 1C มีกลไกในตัวที่สะดวกมาก - ตัวออกแบบแบบสอบถาม ประกอบด้วยแท็บหลักดังต่อไปนี้:

  • "ตารางและฟิลด์" - ประกอบด้วยฟิลด์ที่จะเลือกและแหล่งที่มา
  • "ลิงค์" - อธิบายเงื่อนไขสำหรับโครงสร้างการเชื่อมต่อ
  • "การจัดกลุ่ม" - ประกอบด้วยคำอธิบายของการจัดกลุ่มและฟิลด์สรุปโดยพวกเขา
  • "เงื่อนไข" - รับผิดชอบในการเลือกข้อมูลในคำขอ
  • "ขั้นสูง" - พารามิเตอร์การค้นหาเพิ่มเติม เช่น คีย์เวิร์ดของคำสั่ง "SELECT" เป็นต้น
  • “การรวม / นามแฝง” - ความเป็นไปได้ของการรวมตารางจะถูกระบุและนามแฝงถูกตั้งค่า (โครงสร้าง “HOW”)
  • "Order" - รับผิดชอบในการเรียงลำดับผลลัพธ์ของการค้นหา
  • "ผลรวม" - คล้ายกับแท็บ "การจัดกลุ่ม" แต่ใช้สำหรับการสร้าง "ผลรวม"

สามารถดูข้อความของคำขอได้โดยคลิกที่ปุ่ม "ร้องขอ" ที่มุมล่างซ้าย ในแบบฟอร์มนี้สามารถแก้ไขด้วยตนเองหรือคัดลอกได้


คอนโซลแบบสอบถาม

หากต้องการดูผลลัพธ์ของการค้นหาอย่างรวดเร็วในโหมด "องค์กร" หรือเพื่อแก้ไขข้อบกพร่องของการค้นหาที่ซับซ้อน ให้ใช้ มีการเขียนข้อความค้นหา ตั้งค่าพารามิเตอร์ และแสดงผลลัพธ์

คุณสามารถดาวน์โหลดคอนโซลแบบสอบถามบนดิสก์ ITS หรือโดย

หากคุณกำลังทำงานกับตารางเดียว คุณไม่จำเป็นต้องใช้การรวม เป็นเรื่องที่แตกต่างไปจากเดิมอย่างสิ้นเชิงเมื่อคุณทำงานกับหลายตาราง และตัวอย่างเช่น คุณจำเป็นต้องได้รับข้อมูลทั้งการซื้อและการขายสินค้า

ประโยคที่ใช้ในการรวม รวมกัน. อันที่จริงแล้ว ผลลัพธ์ของการค้นหาจะถูกรวมเข้าด้วยกัน กล่าวคือ แต่ละแบบสอบถามจะรวบรวมข้อมูลโดยอิสระจากกัน และจากนั้น ผลลัพธ์เหล่านี้จะรวมกันเป็นหนึ่งเดียว และเฉพาะในแบบสอบถามสุดท้ายเท่านั้น การดำเนินการอื่นๆ จะดำเนินการ เช่น การสั่งซื้อและการคำนวณผลรวม

เมื่อรวมข้อความค้นหา ผลลัพธ์จะ "ติดกาวในแนวตั้ง" กล่าวคือ แถวผลลัพธ์ของข้อความค้นหาแรกจะไปก่อน แล้วจึงแถวที่สอง

เรามาฝึกกันต่อ:
รหัส 1C v 8.x SELECT
ระบบการตั้งชื่อ
ปริมาณ,
ผลรวม
จาก
เอกสาร.ใบเสร็จ.สินค้า

รวมกัน

เลือก
ระบบการตั้งชื่อ
ปริมาณ,
ผลรวม
จาก
เอกสาร.ใบเสร็จ.สินค้า

ผลลัพธ์ของแบบสอบถามนี้มีดังต่อไปนี้:
ระบบการตั้งชื่อ จำนวน จำนวนเงิน
กระดาษ A4 25 14 500
สติกเกอร์ 500 ล. 8 4 880
ไฟล์ใส 5 4 100
ชุดสำนักงาน 8 8 840

เป็นผลให้เราจะได้สองตารางที่จะเชื่อมต่อกัน เป็นการยากที่จะดูว่าเอกสารขาเข้าสิ้นสุดที่ใดและเอกสารขาออกเริ่มต้นที่ใด แต่เราจะทำบางสิ่งเพื่อทำความเข้าใจ:
รหัส 1C โวลต์ 8.x
เลือก
ระบบการตั้งชื่อ
จำนวน AS QtyIncoming,
จำนวน AS SumIncome
0 วิธีปริมาณการใช้
0 AS SUMค่าใช้จ่าย
จาก
เอกสาร.ใบเสร็จ.สินค้า

รวมกัน

เลือก
ระบบการตั้งชื่อ
0 AS NumberIncoming,
0 AS SumIncome,
ปริมาณ AS จำนวน ค่าใช้จ่าย
จำนวน AS SumExpense
จาก
เอกสาร วัสดุสิ้นเปลือง สินค้า

ดังที่คุณเห็นจากข้อความคำขอ เราได้ตั้งค่านามแฝงที่แตกต่างกันสำหรับแต่ละเอกสารสำหรับปริมาณและจำนวนเงิน นอกจากนี้ แทนที่ฟิลด์ที่เราจะได้รับค่าของจำนวนและปริมาณ เราจะใส่ศูนย์ สิ่งนี้จำเป็นเพื่อให้ค่าว่างของจำนวนเงินและจำนวนถูกแทนที่ด้วยศูนย์

กระดาษ A4 25 14 500
สติกเกอร์ 500 ล. 8 4 880
ไฟล์ใส 5 4 100
ชุดสำนักงาน 8 8 840
สำนักงานชุดที่ 1 1 105
ไฟล์ใส 1 820
สติกเกอร์ 500 ล. 1 610

ตอนนี้เราต้องลบองค์ประกอบที่ซ้ำกันออกจากผลการสืบค้น เรามีคำถาม 2 รายการ และถ้าเรายุบแต่ละรายการแยกกันเพื่อแยกองค์ประกอบที่ซ้ำกัน เราจะดำเนินการไม่สำเร็จ ดังนั้นเราจะนำแบบสอบถามไปไว้ในแบบฟอร์มต่อไปนี้:
รหัส 1C โวลต์ 8.x
เลือก
ระบบการตั้งชื่อ
SUM(จำนวนรายได้) AS จำนวนรายได้
SUM (SumIncome) เป็น SumIncome
SUM(จำนวนค่าใช้จ่าย) AS จำนวนค่าใช้จ่าย
SUM(SumExpense) เป็น SumExpense
จาก

(เลือก
ระบบการตั้งชื่อ
จำนวน AS QtyIncoming,
จำนวน AS SumIncome
0 วิธีปริมาณการใช้
0 AS SUMค่าใช้จ่าย
จาก
เอกสาร.ใบเสร็จ.สินค้า

รวมกัน

เลือก
ระบบการตั้งชื่อ
0 AS NumberIncoming,
0 AS SumIncome,
ปริมาณ AS จำนวน ค่าใช้จ่าย
จำนวน AS SumExpense
จาก
Document.Consumable.Products) AS NestedRequest

จัดกลุ่มตามระบบการตั้งชื่อ

ดังนั้นเราจึงเห็นว่าข้อความค้นหาทั้งหมดของเราอยู่ในวงเล็บเหลี่ยมและตั้งชื่อเป็น NestedQuery สิ่งนี้ทำเพื่อให้เราสามารถจัดกลุ่มเรกคอร์ดจากทั้งเคียวรีย่อยและกำจัดองค์ประกอบที่ซ้ำกัน โครงสร้างดังกล่าวเรียกว่าคิวรีซ้อน ผลลัพธ์ของแบบสอบถามนี้มีดังต่อไปนี้:
ระบบการตั้งชื่อ จำนวนรวมขาเข้า จำนวนรับเข้า ค่าใช้จ่าย รวมค่าใช้จ่าย
กระดาษ A4 25 14 500
สติกเกอร์ 500 ล. 8 4 880 1 610
ชุดสำนักงาน 5 4 100 1 1 105
ไฟล์ใส 8 8 840 1 820

เป็นผลให้เราได้รับตารางที่จัดกลุ่มซึ่งข้อมูลจากข้อความค้นหาย่อยที่ซ้อนกันจะลดลงเป็นรูปแบบที่ชัดเจน จำนวนของข้อความค้นหาที่ซ้อนกันไม่ควรเกิน 255 เราใช้ข้อความค้นหาย่อยสี่รายการที่นี่

หากเราต้องการปล่อยเฉพาะค่าเฉพาะของระเบียนในแบบสอบถามโดยไม่ใช้การจัดกลุ่ม จำเป็นต้องเขียนประโยค JOIN โดยไม่มีคีย์เวิร์ด ALL

ข้อมูลที่นำมาจากเว็บไซต์

; แบบสอบถามย่อย (กำลังพัฒนา)

การรับสินค้าและบริการและ การส่งคืนสินค้าไปยังซัพพลายเออร์ตามระยะเวลาที่กำหนด

แท็บใหม่: สหภาพแรงงาน/นามแฝง

ส่วนทางทฤษฎีของบทเรียนหมายเลข 4

Query Builder 1c ช่วยให้คุณสร้างการรวมแบบสอบถาม ด้วยความช่วยเหลือ คุณสามารถส่งออกข้อมูลที่ได้รับจากการสืบค้นหลายรายการตามลำดับเป็นผลลัพธ์โดยไม่ต้องใช้ความสัมพันธ์ เงื่อนไขเดียวสำหรับการเข้าร่วมคือฟิลด์ชุดเดียวกันในทุกแบบสอบถาม

ในตัวสร้าง ไปที่แท็บ สหภาพแรงงาน/นามแฝง. มีไว้สำหรับสร้างการรวมแบบสอบถามและสำหรับการตั้งค่านามแฝงสำหรับฟิลด์แบบสอบถาม จำเป็นต้องใช้นามแฝงของฟิลด์หากคุณไม่คุ้นเคยกับชื่อฟิลด์ฐานข้อมูลมาตรฐาน หากฟิลด์คิวรีประกอบด้วยฟิลด์ตารางฐานข้อมูลเท่านั้น จึงไม่จำเป็นต้องใช้นามแฝงสำหรับฟิลด์นั้น หากคุณใช้ฟังก์ชันภาษาคิวรีเมื่อสร้างฟิลด์ จำเป็นต้องมีนามแฝงสำหรับฟิลด์ดังกล่าว สำหรับฟิลด์ดังกล่าว ตัวสร้างแบบสอบถามจะสร้างนามแฝงมาตรฐาน Field1…FieldNนามแฝงเหล่านี้สามารถแทนที่ด้วยอะไรก็ได้ที่คุณสะดวก

พิจารณาส่วนต่างๆ ของแท็บ สหภาพแรงงาน/นามแฝง:

  • คำขอ(กรอบสีแดง). ส่วนนี้ประกอบด้วยตารางที่แสดงข้อความค้นหาแบบรวมทั้งหมด โดยใช้เมนูที่อยู่เหนือส่วนนี้ คุณสามารถเพิ่มรายการใหม่ คัดลอกรายการที่มีอยู่ และลบรายการที่เลือก ตลอดจนสลับรายการเหล่านั้น เมื่อเพิ่มหรือคัดลอกแบบสอบถาม ตัวออกแบบไปที่แท็บ ตารางและเขตข้อมูลซึ่งคุณสามารถตั้งค่าตารางฐานข้อมูลและฟิลด์ที่จำเป็นสำหรับแบบสอบถามใหม่ คุณสามารถสลับไปมาระหว่างคำขอได้โดยใช้แท็บที่จะปรากฏทางด้านขวาของตัวสร้างเมื่อมีการเพิ่มคำขอ 1s ใหม่

  • โต๊ะ คำขอสองคอลัมน์:
    • ชื่อ. ตั้งค่าโดยอัตโนมัติในรูปแบบ ขอ 1 … ขอ N;
    • ไม่มีรายการที่ซ้ำกัน. ตั้งค่าว่าจำเป็นต้องแยกแถวที่ซ้ำกันออกเมื่อเชื่อมต่อกับข้อความค้นหาก่อนหน้าหรือไม่ เป็นที่น่าสังเกตว่าแฟล็กนี้จะส่งผลต่อการรวมคำขอซึ่งตั้งค่าไว้พร้อมกับคำขอก่อนหน้าเท่านั้น

  • นามแฝง(กรอบสีน้ำเงิน). ในส่วนนี้ คุณสามารถตั้งค่านามแฝงสำหรับฟิลด์คิวรี รวมถึงฟิลด์จับคู่สำหรับคิวรีแบบรวม เพื่อให้ผลลัพธ์ของคิวรีอยู่ในคอลัมน์เดียวกันและแสดงภายใต้นามแฝงเดียวกัน หากฟิลด์ในแบบสอบถามแบบรวมมีชื่อเหมือนกัน ความสอดคล้องระหว่างกันจะถูกปรับโดยอัตโนมัติ ในการตั้งค่าความสอดคล้องของฟิลด์ คุณต้องค้นหาบรรทัดที่มีนามแฝงที่ต้องการในตาราง ค้นหาข้อความค้นหาที่ต้องการในคอลัมน์ และเลือกฟิลด์ในรายการแบบหล่นลง

ภาคปฏิบัติของบทเรียนหมายเลข 4

ลองวิเคราะห์วิธีแก้ปัญหาที่ได้รับในตอนต้นของบทเรียน ฉันขอเตือนคุณเงื่อนไข:

งาน: เลือกเอกสารที่โพสต์ทั้งหมดตามแบบสอบถาม การรับสินค้าและบริการและ การส่งคืนสินค้าไปยังซัพพลายเออร์ตามระยะเวลาที่กำหนด

  1. มาสร้างคำขอใหม่กันเถอะ
  2. มาเปิดตัวสร้างแบบสอบถามกันเถอะ
  3. มาเลือกโต๊ะกันเถอะ บริการสินค้าขาเข้าจากสาขา เอกสาร;
  4. จากตาราง บริการสินค้าขาเข้าเลือกฟิลด์ ลิงค์;
  5. ไปที่แท็บกันเถอะ เงื่อนไข;
  6. ในบท เขตข้อมูล,เปิดสาขา บริการสินค้าขาเข้าใช้ปุ่ม "+"
  7. มาหาอุปกรณ์ประกอบฉากกันเถอะ วันที่แล้วลากไปที่ส่วนเงื่อนไข เลือกตัวดำเนินการเปรียบเทียบ ระหว่างและระบุพารามิเตอร์สำหรับจุดเริ่มต้นและจุดสิ้นสุดของงวด เช่น ต้นงวดและ สิ้นสุดระยะเวลา;
  8. ไปที่แท็บกันเถอะ สหภาพแรงงาน/นามแฝง.
  9. เพิ่มคำขอใหม่ แฟล็ก ไม่มีรายการที่ซ้ำกันไม่จำเป็นต้องเพิ่มเนื่องจากเราใช้เอกสารประเภทต่างๆ

  10. Query Builder 1s จะไปที่แท็บโดยอัตโนมัติ ตารางและเขตข้อมูล. ในส่วนด้านขวาของหน้าต่าง คุณจะเห็นว่าคำขอเข้าร่วมที่สองทำงานอยู่


  11. ทำซ้ำขั้นตอนที่ 1 - 7 สำหรับตาราง การส่งคืนสินค้าไปยังซัพพลายเออร์;
  12. กลับไปที่แท็บกันเถอะ สหภาพแรงงาน/นามแฝง. ในตารางนามแฝง คุณจะเห็นว่าเขตข้อมูล ลิงค์ทั้งสองตารางอยู่ในบรรทัดเดียวกัน ซึ่งหมายความว่าลิงก์ไปยังเอกสารทั้งสองจะอยู่ในคอลัมน์เดียวกันตามผลลัพธ์ของแบบสอบถาม
  13. เปลี่ยนชื่อคอลัมน์จาก ลิงค์บน เอกสาร(ตั้งนามแฝงของฟิลด์) ในการทำเช่นนี้ให้ดับเบิลคลิกที่ชื่อฟิลด์ด้วยปุ่มซ้ายของเมาส์ จากนั้นคุณสามารถตั้งชื่อของคุณป้อนที่นั่น เอกสาร;

  14. คำขอพร้อมแล้ว คลิกปุ่ม "ตกลง" ที่ด้านล่างของหน้าต่างตัวออกแบบ

ดังนั้นเราจะได้รับคำขอพร้อมข้อความต่อไปนี้

มีบางสถานการณ์ที่จำเป็นต้องรวมแบบสอบถามหลายรายการในแบบสอบถามเดียว และการรวมตารางไม่สามารถช่วยในทางใดทางหนึ่ง แสดงตัวอย่างได้ง่ายที่สุด

สมมติว่าในระบบของเราข้อเท็จจริงของการซื้อและขายสินค้าได้รับการบันทึกโดยเอกสาร รายรับและรายจ่าย ตามลำดับ คู่สัญญาสามารถเป็นได้ทั้งผู้ซื้อและซัพพลายเออร์ การหักล้างหนี้สามารถทำได้โดยการส่งมอบสินค้า:

ในการคำนวณหนี้รวมของคู่สัญญา จำเป็นต้องบวกผลรวมของค่าใช้จ่ายทั้งหมดสำหรับคู่สัญญานี้ และลบผลรวมของรายรับทั้งหมดจากคู่สัญญารายเดียวกัน วิธีที่ง่ายที่สุดในการทำเช่นนี้คือการใช้ตัวดำเนินการ UNITE ALL:

คำขอข้อความ =
"
// คำนวณจำนวนเงินที่เราจัดส่งไปยังคู่ค้า
|เลือก
| การบริโภค คู่สัญญา
| จาก
| Document.Expense AS ค่าใช้จ่าย
|กลุ่มโดย
| การบริโภค. คู่สัญญา
|เข้าร่วมทั้งหมด
//คำนวณจำนวนคู่สัญญา
//ส่งสินค้าให้เรา
|เลือก
| มาถึง.ผู้รับเหมา,
// รับจำนวนที่มีเครื่องหมายลบ
//ซึ่งเมื่อรวมกันแล้วจะถูกหักออกจากยอดค่าใช้จ่าย
| SUM(-Incoming.Amount)
| จาก
| เอกสารขาเข้าเป็นขาเข้า
|กลุ่มโดย
| มาถึงผู้รับเหมา";

ในคำขอแรก เราคำนวณจำนวนค่าใช้จ่ายสำหรับคู่สัญญาแต่ละราย ในคำขอที่สอง - จำนวนเงินที่คู่สัญญาแต่ละรายจัดส่งสินค้าให้เรา จำนวนเงินในแบบสอบถามที่สองมีเครื่องหมายลบ ดังนั้นเมื่อตารางผลลัพธ์ถูกยุบ ตารางจะถูกหักออกจากจำนวนของการจัดส่งไปยังคู่สัญญานี้ เป็นผลให้เราได้รับตารางของแบบฟอร์ม:

ไม่ใช่สิ่งที่เราต้องการ แต่ก็ใกล้เคียง เพื่อให้บรรลุผลตามที่ต้องการ ก็ยังคงจัดกลุ่มตามคู่สัญญา ในการดำเนินการนี้ ต้องวางคิวรีในตารางชั่วคราว (มีการกล่าวถึงการทำงานกับตารางชั่วคราวใน ปิดส่วนหนึ่งของหลักสูตร ) และเลือกและจัดกลุ่มฟิลด์จากนั้น:

คำขอ = คำขอใหม่;
คำขอข้อความ =
"เลือก
| การบริโภค คู่สัญญา
| AMOUNT(Expense.Amount) เป็นหนี้
|PUT TU_รายรับรายจ่าย
| จาก
| Document.Expense AS ค่าใช้จ่าย
|กลุ่มโดย
| การบริโภค. คู่สัญญา
|เข้าร่วมทั้งหมด
|เลือก
| มาถึง.ผู้รับเหมา,
| SUM(-Incoming.Amount)
| จาก
| เอกสารขาเข้าเป็นขาเข้า
|กลุ่มโดย
| มาถึง.ผู้รับเหมา
|;
|////////////////////////////////////////////////////////////////////////////////
|เลือก
| อ._ค่าใช้จ่ายที่เข้ามาคู่สัญญา
| SUM(BT_IncomeExpense.Debt) เป็นหนี้
| จาก
| Tue_IncomeExpense AS Tue_IncomeExpense
|กลุ่มโดย
| อ._ค่าใช้จ่ายขาเข้า.คู่สัญญา";

ข้อกำหนดสำหรับการรวมแบบสอบถาม

เมื่อรวมการค้นหาสองรายการ จำนวนฟิลด์ในฟิลด์นั้นต้องเท่ากัน หากแบบสอบถามใดไม่มีฟิลด์ จะต้องเพิ่มฟิลด์เหล่านั้นเป็นค่าคงที่ ลองดูตัวอย่างด้านบน สมมติว่าเอกสารค่าใช้จ่ายยังมีฟิลด์ส่วนลด ซึ่งลดหนี้ของคู่สัญญา แต่ไม่มีส่วนลดในเอกสารรายได้ ในกรณีนี้จะเป็นอย่างไร? ดังนั้น:

คำขอ = คำขอใหม่;
คำขอข้อความ =
"เลือก
| การบริโภค คู่สัญญา

| จาก
| Document.Expense AS ค่าใช้จ่าย
|กลุ่มโดย
| การบริโภค. คู่สัญญา
|เข้าร่วมทั้งหมด
|เลือก
| มาถึง.ผู้รับเหมา,
| SUM(-Incoming.Amount),
// เพิ่มส่วนลดฟิลด์ว่าง
| 0
| จาก
| เอกสารขาเข้าเป็นขาเข้า
|กลุ่มโดย
| มาถึงผู้รับเหมา";

มันยังคงลบส่วนลดและกลุ่ม

ลำดับก็สำคัญเช่นกัน ฟิลด์จะถูกรวมตามลำดับที่ระบุไว้ในส่วน SELECT ของแบบสอบถามทั้งสอง จากตัวอย่างก่อนหน้านี้ เรามาสลับฟิลด์ส่วนลดและจำนวนเงินในการเลือกใบเสร็จ:

คำขอ = คำขอใหม่;
คำขอข้อความ =
"เลือก
| การบริโภค คู่สัญญา
| จำนวน (ค่าใช้จ่ายจำนวนเงิน) เป็นหนี้
| SUM(ค่าใช้จ่าย.ส่วนลด) AS ส่วนลด
| จาก
| Document.Expense AS ค่าใช้จ่าย
|กลุ่มโดย
| การบริโภค. คู่สัญญา
|เข้าร่วมทั้งหมด
|เลือก
| มาถึง.ผู้รับเหมา,
//แลกเปลี่ยน
| 0,
| SUM(-Incoming.Amount)
| จาก
| เอกสารขาเข้าเป็นขาเข้า
|กลุ่มโดย
| มาถึงผู้รับเหมา";

ขอให้เป็นวันที่ดีผู้อ่านบล็อกที่รัก วันนี้เราจะหารือในรายละเอียด การรวมคำขอใน 1C. คุณยังสามารถดาวน์โหลดสำหรับการจัดการธุรกิจการกำหนดค่าทั่วไปสำหรับคาซัคสถาน รุ่น 1.0

หากคุณกำลังทำงานกับตารางเดียว คุณไม่จำเป็นต้องใช้การรวม เป็นเรื่องที่แตกต่างไปจากเดิมอย่างสิ้นเชิงเมื่อคุณทำงานกับหลายตาราง ตัวอย่างเช่น คุณจำเป็นต้องได้รับข้อมูลเกี่ยวกับการซื้อและการขายสินค้า

ประโยคที่ใช้ในการรวม ยูเนี่ยน/ยูเนี่ยน. เกิดอะไรขึ้นจริงๆ รวมผลการสืบค้นนั่นคือ แบบสอบถามแต่ละรายการจะรวบรวมข้อมูลโดยอิสระจากกัน จากนั้นผลลัพธ์เหล่านี้จะรวมกันเป็นหนึ่งเดียว และเฉพาะในแบบสอบถามสุดท้ายเท่านั้น การดำเนินการอื่นๆ จะดำเนินการ เช่น การสั่งซื้อและการคำนวณผลรวม

ผลลัพธ์ที่ได้จะ "ติดกาวในแนวตั้ง" ซึ่งแตกต่างจากเมื่อรวมข้อความค้นหา กล่าวคือ แถวผลลัพธ์ของข้อความค้นหาแรกจะไปก่อน แล้วจึงแถวที่สอง

เรามาฝึกกันต่อ:

เลือกระบบการตั้งชื่อ ปริมาณ จำนวน รวมกันเลือกระบบการตั้งชื่อ จำนวน จำนวน จากเอกสาร วัสดุสิ้นเปลือง สินค้า

ผลลัพธ์ของแบบสอบถามนี้มีดังต่อไปนี้:

เป็นผลให้เราจะได้สองตารางที่จะเชื่อมต่อกัน เป็นการยากที่จะดูว่าเอกสารขาเข้าสิ้นสุดที่ใดและเอกสารขาออกเริ่มต้นที่ใด แต่เราจะทำบางสิ่งเพื่อค้นหา:

เลือกระบบการตั้งชื่อ ปริมาณ AS เบอร์ปริคอด, ผลรวม AS สุมปริโคตร, 0 อ จำนวนค่าใช้จ่าย, 0 อ สรุปค่าใช้จ่ายจากเอกสารขาเข้าสินค้า รวมกัน เบอร์ปริคอด, 0 อ สุมปริโคตร,หมายเลขอ.ส จำนวนค่าใช้จ่าย, ผลรวม AS สรุปค่าใช้จ่ายจากเอกสาร วัสดุสิ้นเปลือง สินค้า

ดังที่คุณเห็นจากข้อความคำขอ เราได้ตั้งค่านามแฝงที่แตกต่างกันสำหรับแต่ละเอกสารสำหรับปริมาณและจำนวนเงิน นอกจากนี้ แทนที่ฟิลด์ที่เราจะได้รับค่าของจำนวนและปริมาณ เราจะใส่ศูนย์ สิ่งนี้จำเป็นเพื่อให้ค่าว่างของจำนวนเงินและจำนวนถูกแทนที่ด้วยศูนย์

ระบบการตั้งชื่อ เบอร์ปริคอด สุมปริโคตร จำนวนค่าใช้จ่าย สรุปค่าใช้จ่าย
กระดาษ A4 25 14 500
สติ๊กเกอร์ 500l 8 4 880
ไฟล์มีความโปร่งใส 5 4 100
ชุดสำนักงาน 8 8 840
ชุดสำนักงาน 1 1 105
ไฟล์มีความโปร่งใส 1 820
สติ๊กเกอร์ 500l 1 610

ตอนนี้เราต้องลบองค์ประกอบที่ซ้ำกันออกจากผลการสืบค้น เรามีคำถาม 2 รายการ และถ้าเรายุบแต่ละรายการแยกกันเพื่อแยกองค์ประกอบที่ซ้ำกัน เราจะดำเนินการไม่สำเร็จ ดังนั้นเราจะนำแบบสอบถามไปไว้ในแบบฟอร์มต่อไปนี้:

เลือก
ระบบการตั้งชื่อ
SUM(จำนวนรายได้) AS จำนวนรายได้
SUM (SumIncome) เป็น SumIncome
SUM(จำนวนค่าใช้จ่าย) AS จำนวนค่าใช้จ่าย
SUM(SumExpense) เป็น SumExpense
จาก
(
เลือกระบบการตั้งชื่อ ปริมาณ AS เบอร์ปริคอด, ผลรวม AS สุมปริโคตร, 0 อ จำนวนค่าใช้จ่าย, 0 อ สรุปค่าใช้จ่ายจากเอกสารขาเข้าสินค้า รวมกันเลือกระบบการตั้งชื่อ, 0 AS เบอร์ปริคอด, 0 อ สุมปริโคตร,หมายเลขอ.ส จำนวนค่าใช้จ่าย, ผลรวม AS สรุปค่าใช้จ่ายจากเอกสาร วัสดุสิ้นเปลือง สินค้า ) AS NestedQuery
จัดกลุ่มตามระบบการตั้งชื่อ

ดังนั้นเราจึงเห็นว่าข้อความค้นหาทั้งหมดของเราอยู่ในวงเล็บเหลี่ยมและตั้งชื่อเป็น NestedQuery สิ่งนี้ทำเพื่อให้เราสามารถจัดกลุ่มเรกคอร์ดจากทั้งเคียวรีย่อยและกำจัดองค์ประกอบที่ซ้ำกัน โครงสร้างดังกล่าวเรียกว่าคิวรีซ้อน ผลลัพธ์ของแบบสอบถามนี้มีดังต่อไปนี้:

ระบบการตั้งชื่อ เบอร์ปริคอด สุมปริโคตร จำนวนค่าใช้จ่าย สรุปค่าใช้จ่าย
กระดาษ A4 25 14 500
สติ๊กเกอร์ 500l 8 4 880 1 610
ชุดสำนักงาน 5 4 100 1 1 105
ไฟล์มีความโปร่งใส 8 8 840 1 820

เป็นผลให้เราได้รับตารางที่จัดกลุ่มซึ่งข้อมูลจากข้อความค้นหาย่อยที่ซ้อนกันจะลดลงเป็นรูปแบบที่ชัดเจน
จำนวนของข้อความค้นหาที่ซ้อนกันไม่ควรเกิน 255 เราใช้ข้อความค้นหาย่อยสี่รายการที่นี่