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

4
แนวปฏิบัติที่เหมาะสมระหว่างการใช้ LEFT JOIN หรือ EXISTS
มีวิธีปฏิบัติที่ดีที่สุดระหว่างการใช้ LEFT JOIN หรือรูปแบบ NOT EXISTS หรือไม่? ประโยชน์ที่จะได้รับจากการใช้อย่างใดอย่างหนึ่งคืออะไร? ถ้าไม่มีควรเลือกแบบไหนดี? SELECT * FROM tableA A LEFT JOIN tableB B ON A.idx = B.idx WHERE B.idx IS NULL SELECT * FROM tableA A WHERE NOT EXISTS (SELECT idx FROM tableB B WHERE B.idx = A.idx) ฉันใช้คิวรีภายใน Access กับฐานข้อมูล SQL Server

2
ถ้ามีอยู่ใช้เวลานานกว่าคำสั่ง select ฝังตัว
เมื่อฉันเรียกใช้รหัสต่อไปนี้มันใช้เวลา 22.5 นาทีและ 106 ล้านอ่าน อย่างไรก็ตามถ้าฉันเรียกใช้เพียงคำสั่งเลือกภายในด้วยตัวเองมันใช้เวลาเพียง 15 วินาทีและอ่านได้ 264k ในฐานะที่เป็นข้อความด้านแบบสอบถามแบบใช้เลือกข้อมูลจะไม่ส่งกลับระเบียน ความคิดใดที่ว่าทำไมIF EXISTSมันถึงทำให้มันใช้งานได้นานขึ้นและอ่านได้มากขึ้น? ฉันเปลี่ยนคำสั่ง select เป็นสิ่งที่ต้องทำSELECT TOP 1 [dlc].[id]และฉันก็ฆ่ามันหลังจาก 2 นาที ในฐานะที่เป็นแก้ไขชั่วคราวฉันมีการเปลี่ยนแปลงจะทำนับ (*) @cntและกำหนดค่าที่ให้กับตัวแปร จากนั้นจะมีIF 0 <> @cntคำสั่ง แต่ฉันคิดว่าEXISTSจะดีกว่าเพราะถ้ามีการบันทึกกลับมาในคำสั่ง select มันจะหยุดทำการสแกน / ค้นหาเมื่อพบอย่างน้อยหนึ่งระเบียนในขณะที่count(*)จะทำการสืบค้นแบบเต็ม ฉันพลาดอะไรไป IF EXISTS (SELECT [dlc].[ID] FROM TableDLC [dlc] JOIN TableD [d] ON [d].[ID] = [dlc].[ID] JOIN TableC [c] …

3
การตัดคำค้นหาใน IF EXISTS ทำให้ช้ามาก
ฉันมีแบบสอบถามด้านล่าง: select databasename from somedb.dbo.bigtable l where databasename ='someval' and source <>'kt' and not exists(select 1 from dbo.smalltable c where c.source=l.source) แบบสอบถามด้านบนเสร็จสมบูรณ์ในสามวินาที หากเคียวรีด้านบนคืนค่าใด ๆ เราต้องการให้โพรซีเดอร์ที่เก็บไว้เป็น EXIT ดังนั้นฉันจึงเขียนมันใหม่ด้านล่าง: If Exists( select databasename from somedb.dbo.bigtable l where databasename ='someval' and source <>'kt' and not exists(select 1 from dbo.smalltable c where c.source=l.source) ) …

1
SQL Spec ต้องการ GROUP BY ใน EXISTS () หรือไม่
Microsoft อนุญาตให้ใช้ไวยากรณ์นี้ในขณะนี้ SELECT * FROM ( VALUES (1) ) AS g(x) WHERE EXISTS ( SELECT * FROM ( VALUES (1),(1) ) AS t(x) WHERE g.x = t.x HAVING count(*) > 1 ); ขอให้สังเกตว่าไม่มีGROUP BYในEXISTSข้อเป็น ANSI SQL ที่ถูกต้อง หรือเป็นเพียงการเปิดเผยรายละเอียดการปฏิบัติ สำหรับการอ้างอิงไวยากรณ์เดียวกันนี้ไม่ได้รับอนุญาตใน PostgreSQL ข้อผิดพลาด: คอลัมน์ "tx" จะต้องปรากฏในกลุ่มตามข้อหรือจะใช้ในฟังก์ชั่นรวม แต่ไวยากรณ์นี้ได้รับอนุญาต .. SELECT * FROM ( …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.