คำถามติดแท็ก except

การใช้งานและความหมายของการดำเนินการทางตรรกะ EXCEPT

2
การใช้ข้อยกเว้นในนิพจน์ตารางแบบเรียกซ้ำ
เหตุใดแบบสอบถามต่อไปนี้จึงส่งกลับแถวที่ไม่มีที่สิ้นสุด ฉันคาดว่าจะมีEXCEPTประโยคที่จะยุติการสอบถามซ้ำ .. with cte as ( select * from ( values(1),(2),(3),(4),(5) ) v (a) ) ,r as ( select a from cte where a in (1,2,3) union all select a from ( select a from cte except select a from r ) x ) select a from r ฉันเจอสิ่งนี้ในขณะที่พยายามตอบคำถามเกี่ยวกับ …

4
แสดงแถวที่แตกต่างระหว่างสองตารางหรือคิวรีได้อย่างง่ายดาย
ลองนึกภาพคุณมีสองตาราง / แบบสอบถามที่แตกต่างกันที่ควรจะมี / ส่งคืนข้อมูลที่เหมือนกัน คุณต้องการตรวจสอบสิ่งนี้ วิธีง่ายๆในการแสดงแถวที่ไม่ตรงกันจากแต่ละตารางเหมือนกับตัวอย่างด้านล่างคือการเปรียบเทียบทุกคอลัมน์ สมมติว่ามี 30 คอลัมน์ในตารางซึ่งหลายแห่งเป็น NULLable เมื่อไม่มี PK หรืออาจมีการทำซ้ำต่อ PK การเข้าร่วมในคอลัมน์ PK เพียงอย่างเดียวไม่เพียงพอและจะเป็นความหายนะที่จะต้องทำการเข้าร่วมแบบเต็มโดยมีเงื่อนไขการเข้าร่วม 30 รายการที่จัดการ NULL ได้อย่างเหมาะสมรวมถึงเงื่อนไขที่น่ารังเกียจ เพื่อยกเว้นแถวที่ตรงกัน โดยปกติแล้วคือเมื่อฉันเขียนแบบสอบถามใหม่กับข้อมูลที่ไม่มีการ unscrbed หรือไม่เข้าใจว่าปัญหานั้นเลวร้ายที่สุดและความน่าจะเป็นของ PK ที่มีอยู่ในเชิงตรรกะนั้นต่ำมาก ฉันทำสองวิธีที่แตกต่างกันเพื่อแก้ไขปัญหาแล้วเปรียบเทียบผลลัพธ์ของพวกเขาความแตกต่างที่เน้นกรณีพิเศษในข้อมูลที่ฉันไม่ทราบ ผลลัพธ์ต้องมีลักษณะดังนี้: Which Col1 Col2 Col3 ... Col30 ------ ------ ------ ------ ------ TableA Cat 27 86 -- mismatch TableB Cat 27 …

3
ยกเว้นผู้ประกอบการ vs NOT IN
ตัวEXCEPTดำเนินการถูกนำมาใช้ใน SQL Server 2005 แต่ความแตกต่างระหว่างNOT INและEXCEPTคืออะไร มันทำเช่นเดียวกัน? ฉันต้องการคำอธิบายง่ายๆพร้อมตัวอย่าง

1
ไม่ควรหลีกเลี่ยงใน
ในบรรดานักพัฒนา SQL Server บางคนเป็นความเชื่อที่ถือกันอย่างกว้างขวางว่าNOT INช้ามากและควรเขียนคำสั่งใหม่เพื่อให้ผลลัพธ์เหมือนเดิม แต่ไม่ใช้คำหลัก "ความชั่วร้าย" ( ตัวอย่าง ) มีความจริงใด ๆ หรือไม่? ตัวอย่างเช่นมีข้อบกพร่องบางอย่างที่รู้จักใน SQL Server (เวอร์ชันใด) ที่ทำให้การสืบค้นที่ใช้NOT INมีแผนการดำเนินการที่เลวร้ายยิ่งกว่าแบบสอบถามที่เทียบเท่าที่ใช้ LEFT JOINรวมกับNULLการตรวจสอบหรือ (SELECT COUNT(*) ...) = 0ในWHEREข้อ?

5
ประสิทธิภาพของเซิร์ฟเวอร์ SQL ที่เชื่อมโยงกับเซิร์ฟเวอร์: เหตุใดแบบสอบถามระยะไกลจึงมีราคาแพง
ฉันมีเซิร์ฟเวอร์ฐานข้อมูลสองตัวเชื่อมต่อผ่านเซิร์ฟเวอร์ที่เชื่อมโยง ทั้งสองเป็นฐานข้อมูล SQL Server 2008R2 และการเชื่อมต่อเซิร์ฟเวอร์ที่เชื่อมโยงจะทำผ่านลิงค์ "SQL Server" ปกติโดยใช้บริบทความปลอดภัยของการเข้าสู่ระบบปัจจุบัน เซิร์ฟเวอร์ที่เชื่อมโยงนั้นมีทั้งในดาต้าเซ็นเตอร์เดียวกันดังนั้นการเชื่อมต่อจึงไม่เป็นปัญหา ฉันใช้แบบสอบถามต่อไปนี้เพื่อตรวจสอบว่าค่าของคอลัมน์identifierใดที่พร้อมใช้งานจากระยะไกล แต่ไม่ใช่ภายในเครื่อง SELECT identifier FROM LinkedServer.RemoteDb.schema.[TableName] EXCEPT SELECT DISTINCT identifier FROM LocalDb.schema.[TableName] identifierบนโต๊ะทั้งสองเป็นดัชนีที่ไม่ใช่คลัสเตอร์ในคอลัมน์ ในพื้นที่มีแถว 2.6M แถวจากระยะไกลเพียง 54 แต่เมื่อมองไปที่แผนแบบสอบถาม 70% ของเวลาดำเนินการจะถูกใช้เพื่อ "ประมวลผลแบบสอบถามระยะไกล" นอกจากนี้เมื่อศึกษาแผนคิวรีที่สมบูรณ์จำนวนแถวท้องถิ่นโดยประมาณนั้น1แทน2695380(ซึ่งคือจำนวนแถวโดยประมาณเมื่อเลือกเฉพาะคิวรีที่มาหลังจากนั้นEXCEPT) เมื่อดำเนินการค้นหานี้จะใช้เวลานานแน่นอน มันทำให้ฉันประหลาดใจ: ทำไมถึงเป็นอย่างนี้? การประมาณค่าเป็น "เพียงแค่" ปิดหรือมีการสอบถามระยะไกลบนเซิร์ฟเวอร์ที่เชื่อมโยงที่มีราคาแพงจริงๆ?

4
วิธีที่รวดเร็วในการตรวจสอบสองตารางกับแต่ละอื่น ๆ
เรากำลังทำกระบวนการ ETL เมื่อทุกคนพูดและทำมีกลุ่มของตารางที่ควรจะเหมือนกัน เป็นวิธีที่เร็วที่สุดในการตรวจสอบว่าตารางเหล่านั้น (บนเซิร์ฟเวอร์ที่แตกต่างกันสอง) เป็นจริงเหมือนกัน ฉันกำลังพูดถึงสคีมาและข้อมูล ฉันสามารถแฮชบนโต๊ะเป็นตัวของตัวเองเหมือนที่ฉันจะสามารถใช้กับไฟล์แต่ละไฟล์หรือกลุ่มไฟล์ - เพื่อเปรียบเทียบไฟล์หนึ่งกับอีกไฟล์หนึ่ง เรามีการเปรียบเทียบข้อมูล Red-Gate แต่เนื่องจากตารางที่เป็นปัญหานั้นมีแถวนับล้านแถวฉันจึงต้องการบางสิ่งที่มีประสิทธิภาพมากกว่า วิธีการหนึ่งที่ชั่วช้าฉันนี้ใช้ความคิดสร้างสรรค์ของคำสั่งสหภาพ แต่ฉันต้องการสำรวจแนวคิดแฮชอีกเล็กน้อยหากเป็นไปได้ โพสต์คำตอบปรับปรุง สำหรับผู้เล่นในอนาคต ... นี่คือแนวทางที่แน่นอนที่ฉันได้รับ มันทำงานได้ดีเรากำลังทำทุกตารางในแต่ละฐานข้อมูล ขอบคุณคำตอบด้านล่างสำหรับชี้ฉันในทิศทางที่ถูกต้อง CREATE PROCEDURE [dbo].[usp_DatabaseValidation] @TableName varchar(50) AS BEGIN SET NOCOUNT ON; -- parameter = if no table name was passed do them all, otherwise just check the one -- create …

2
วิธีที่มีประสิทธิภาพในการเปรียบเทียบชุดข้อมูลขนาดใหญ่สองชุดใน SQL
ขณะนี้ฉันกำลังเปรียบเทียบชุดข้อมูลสองชุดที่มีStoreKey/ProductKeyชุดค่าผสมที่ไม่ซ้ำกัน ชุดข้อมูลชุดที่ 1 มีชุดค่าStoreKey/ProductKeyผสมที่ไม่ซ้ำกันสำหรับการขายระหว่างเริ่มมกราคม 2012 และสิ้นสุดพฤษภาคม 2014 (ผลลัพธ์ = 450K บรรทัด) ชุดข้อมูลที่ 2 มีชุดค่าStoreKey/ProductKeyผสมที่ไม่ซ้ำกันสำหรับการขายเริ่มต้นมิถุนายน 2014 จนถึงวันนี้ (ผลลัพธ์ = 190K บรรทัด) ฉันกำลังมองหาStoreKey/ProductKeyชุดค่าผสมที่อยู่ในชุดที่ 2 แต่ไม่ใช่ในชุดที่ 1 - คือผลิตภัณฑ์ใหม่ที่ขายตั้งแต่ต้นเดือนมิถุนายน จนถึงตอนนี้ฉันได้ทิ้งชุดข้อมูลสองชุดลงในตารางชั่วคราวสร้างดัชนีสำหรับทั้งสองตารางบนทั้งสองปุ่มแล้วใช้EXCEPTคำสั่งเพื่อค้นหารายการที่ไม่ซ้ำกัน วิธีที่มีประสิทธิภาพที่สุดในการเปรียบเทียบชุดข้อมูลขนาดใหญ่ดังกล่าวคืออะไร มีวิธีที่มีประสิทธิภาพมากกว่าในการทำการเปรียบเทียบขนาดใหญ่ประเภทนี้หรือไม่

1
อัลกอริทึมที่อยู่เบื้องหลังผู้ประกอบการยกเว้นคืออะไร?
อัลกอริทึมภายในของวิธีการที่ตัวดำเนินการยกเว้นทำงานภายใต้การครอบคลุมใน SQL Server คืออะไร ภายในใช้แฮชของแต่ละแถวและเปรียบเทียบหรือไม่ David Lozinksi ได้ทำการศึกษาSQL: วิธีที่เร็วที่สุดในการแทรกบันทึกใหม่ที่ไม่มีอยู่จริงเขาแสดงให้เห็นว่าคำสั่งนั้นเร็วที่สุดสำหรับแถวจำนวนมาก อย่างใกล้ชิดกับผลลัพธ์ของเราด้านล่าง ข้อสันนิษฐาน: ฉันคิดว่าการเข้าร่วมด้านซ้ายจะเร็วที่สุดเนื่องจากจะเปรียบเทียบเพียง 1 คอลัมน์เท่านั้นยกเว้นจะใช้เวลานานที่สุดเนื่องจากต้องเปรียบเทียบคอลัมน์ทั้งหมด ด้วยผลลัพธ์เหล่านี้ตอนนี้ความคิดของเราคือยกเว้นโดยอัตโนมัติและใช้แฮชของแต่ละแถวภายในหรือไม่ ฉันดูยกเว้นแผนการดำเนินการและใช้แฮชบางอย่าง ความเป็นมา: ทีมของเราเปรียบเทียบตารางฮีปสองโต๊ะ ตาราง A แถวที่ไม่ได้อยู่ในตาราง B ถูกแทรกเข้าไปในตาราง B ตารางฮีป (จากระบบไฟล์ข้อความดั้งเดิม) ไม่มีคีย์ / guids / identifier หลัก บางตารางมีแถวที่ซ้ำกันดังนั้นเราจึงพบแฮชของแต่ละแถวและลบรายการที่ซ้ำกันออกและสร้างตัวระบุคีย์หลัก 1) อันดับแรกเราเรียกใช้คำสั่งยกเว้นยกเว้น (คอลัมน์แฮช) select * from TableA Except Select * from TableB, 2) จากนั้นเราก็วิ่งซ้ายเข้าร่วมเปรียบเทียบระหว่างสองตารางใน HashRowId select * …

3
การระบุว่าค่าใดไม่ตรงกับแถวของตาราง
ฉันต้องการให้สามารถตรวจสอบได้อย่างง่ายดายว่าตัวระบุที่ไม่ซ้ำกันอยู่ในตารางของผู้ที่ระบุในแบบสอบถาม เพื่ออธิบายให้ดียิ่งขึ้นนี่คือสิ่งที่ฉันต้องทำตอนนี้เพื่อตรวจสอบ ID ของรายการ "1, 2, 3, 4" ที่ไม่มีอยู่ในตาราง: SELECT * FROM dbo."TABLE" WHERE "ID" IN ('1','2','3','4')สมมติว่าตารางไม่มีแถวที่มี ID 2 ดัมพ์ผลลัพธ์ลงใน Excel เรียกใช้ VLOOKUP ในรายการต้นฉบับที่ค้นหาแต่ละค่าของรายการในรายการผลลัพธ์ VLOOKUP ใด ๆ ที่ส่งผลให้#N/Aมีค่าที่ไม่ได้เกิดขึ้นในตาราง ฉันคิดว่าต้องมีวิธีที่ดีกว่าในการทำสิ่งนี้ ฉันกำลังมองหาสิ่งที่ต้องการ รายการที่จะตรวจสอบ -> แบบสอบถามบนตารางเพื่อตรวจสอบ -> สมาชิกของรายการที่ไม่ได้อยู่ในตาราง

1
วิธีที่มีประสิทธิภาพที่สุดในการเปรียบเทียบชุดผลลัพธ์ขนาดใหญ่สองชุดใน SQL Server 2012
คำแนะนำในปัจจุบันสำหรับวิธีที่มีประสิทธิภาพที่สุดในการเปรียบเทียบชุดผลลัพธ์ / แถวขนาดใหญ่สองชุดดูเหมือนว่าจะใช้ตัวEXCEPTดำเนินการ สคริปต์ SQL ที่มีอยู่ในตัวเองด้านล่างนี้ไม่มีประสิทธิภาพมากเมื่อขนาดของแถวเพิ่มขึ้น (เปลี่ยนค่า @last) ฉันพยายามค้นหารายการที่ไม่ซ้ำในตารางรวม แต่ไม่มีการปรับปรุง DECLARE @first AS INT, @step AS INT, @last AS INT; -- This script is comparing two record sets using EXCEPT -- I want to find additions from OLD to NEW -- As number of rows increase performance gets terrible -- …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.