ตามมาตรฐาน:
SELECT 1 FROM r HAVING 1=1
วิธี
SELECT 1 FROM r GROUP BY () HAVING 1=1
การอ้างอิง ISO / IEC 9075-2: 2011 7.10 กฎไวยากรณ์ 1 (ส่วนหนึ่งของคำนิยามของส่วนคำสั่ง HAVING):
อนุญาตเป็นHC <having clause>อนุญาตTEเป็นทันทีที่มี<table expression> HCหากTEไม่มีทันทีหมายความว่า
<group by clause>" GROUP BY ()" เป็นนัย อนุญาตTเป็นตัวบ่งชี้ของตารางที่กำหนดโดย<group by clause> GBCทันทีที่มีอยู่ในTEและแจ้งให้Rเป็นผลมาจากGBC.
ตกลงเพื่อที่ชัดเจนมาก
การยืนยัน: 1=1เป็นเงื่อนไขการค้นหาที่แท้จริง ฉันจะไม่ให้การอ้างอิงสำหรับสิ่งนี้
ตอนนี้
SELECT 1 FROM r GROUP BY () HAVING 1=1
เทียบเท่ากับ
SELECT 1 FROM r GROUP BY ()
การอ้างอิง ISO / IEC 9075-2: 2011 7.10 กฎทั่วไป 1:
ได้รับการประเมินในแต่ละกลุ่ม<search condition> Rผลลัพธ์ของการ<having clause>เป็นตารางที่จัดกลุ่มของกลุ่มเหล่านั้นของ R ซึ่งผลลัพธ์ของการ
<search condition>เป็นจริง
ลอจิก: เนื่องจากเงื่อนไขการค้นหาเป็นจริงเสมอผลคือRซึ่งเป็นผลลัพธ์ของกลุ่มโดยการแสดงออก
ต่อไปนี้เป็นข้อความที่ตัดตอนมาจากกฎทั่วไป 7.9 (คำจำกัดความของกลุ่มตาม CLAUSE)
1) ถ้าไม่<where clause>ได้ระบุไว้ให้Tเป็นผลของการก่อนหน้า<from clause>; มิฉะนั้นให้เป็นผลมาจากก่อนหน้านี้T<where clause>
2) กรณี:
ก) หากไม่มีคอลัมน์การจัดกลุ่มผลลัพธ์ของการ<group by clause>คือตารางที่จัดกลุ่มซึ่งประกอบด้วยTกลุ่มเดียว
ดังนั้นเราสามารถสรุปได้ว่า
FROM r GROUP BY ()
แสดงผลลัพธ์ในตารางที่จัดกลุ่มซึ่งประกอบด้วยหนึ่งกลุ่มโดยมีศูนย์แถว (เนื่องจาก R ว่างเปล่า)
ข้อความที่ตัดตอนมาจากกฎทั่วไปที่ 7.12 ซึ่งกำหนดข้อกำหนดการสืบค้น (หรือคำสั่ง SELECT):
1) กรณี:
a) หากTไม่ใช่ตารางที่จัดกลุ่มดังนั้น [... ]
b) ถ้าTเป็นตารางที่จัดกลุ่มแล้ว
กรณี:
i) หากTมีกลุ่ม 0 (ศูนย์) จากนั้นให้ TEMP เป็นตารางว่าง
ii) ถ้าTมีหนึ่งหรือมากกว่าหนึ่งกลุ่มแล้วแต่ละคน<value expression>จะถูกนำไปใช้กับแต่ละกลุ่มTให้ผลผลิตตารางTEMPของMแถวที่เป็นจำนวนของกลุ่มในM คอลัมน์ -th ของ TEMP มีค่าที่ได้มาจากการประเมินผลของ-th [ ... ]Tii<value expression>
2) กรณี:
ก) ในกรณีที่<set quantifier> DISTINCTไม่ได้ระบุไว้แล้วผลมาจากการที่เป็น<query specification>TEMP
ดังนั้นเนื่องจากตารางมีกลุ่มหนึ่งจึงต้องมีแถวผลลัพธ์หนึ่งแถว
ดังนั้น
SELECT 1 FROM r HAVING 1=1
ควรส่งคืนชุดผลลัพธ์ 1 แถว
QED
SELECT COUNT(*) FROM r;ส่งคืน 1 แถว (พร้อม0) ในขณะที่SELECT COUNT(*) FROM r GROUP BY ();ไม่ส่งคืนแถว