เมื่อใดก็ตามที่ฉันต้องการตรวจสอบการมีอยู่ของแถวในตารางฉันมักจะเขียนเงื่อนไขเช่น:
SELECT a, b, c
FROM a_table
WHERE EXISTS
(SELECT * -- This is what I normally write
FROM another_table
WHERE another_table.b = a_table.b
)
คนอื่นเขียนเหมือน:
SELECT a, b, c
FROM a_table
WHERE EXISTS
(SELECT 1 --- This nice '1' is what I have seen other people use
FROM another_table
WHERE another_table.b = a_table.b
)
เมื่อเงื่อนไขNOT EXISTS
แทนEXISTS
: ในบางโอกาสฉันอาจเขียนด้วยเงื่อนไข a LEFT JOIN
และพิเศษ (บางครั้งเรียกว่าantijoin ):
SELECT a, b, c
FROM a_table
LEFT JOIN another_table ON another_table.b = a_table.b
WHERE another_table.primary_key IS NULL
ฉันพยายามหลีกเลี่ยงเพราะฉันคิดว่าความหมายนั้นชัดเจนน้อยกว่าโดยเฉพาะอย่างยิ่งเมื่อสิ่งที่คุณprimary_key
ไม่ชัดเจนหรือเมื่อคีย์หลักหรือเงื่อนไขการเข้าร่วมของคุณเป็นหลายคอลัมน์ (และคุณสามารถลืมหนึ่งในคอลัมน์ได้อย่างง่ายดาย) อย่างไรก็ตามบางครั้งคุณรักษารหัสที่เขียนโดยคนอื่น ... และมันก็อยู่ที่นั่น
มีความแตกต่าง (นอกเหนือจากสไตล์) เพื่อใช้
SELECT 1
แทนSELECT *
หรือไม่?
มีกรณีมุมใด ๆ ที่มันไม่ทำงานเหมือนกันหรือไม่?แม้ว่าสิ่งที่ฉันเขียนคือ SQL มาตรฐาน (AFAIK): มีความแตกต่างสำหรับฐานข้อมูลที่แตกต่างกันหรือเวอร์ชั่นเก่ากว่าหรือไม่?
มีข้อได้เปรียบใด ๆ ในการอธิบายการเขียน antijoin หรือไม่?
นักวางแผนร่วมสมัย / ออพติไมเซอร์ใช้มันแตกต่างจากNOT EXISTS
คำสั่งหรือไม่?
EXISTS (SELECT FROM ...)
ได้