您不能在子句中引用在SELECT
子句中定义的别名WHERE
,但可以在HAVING
子句中使用它们。这是因为WHERE
之前评估过SELECT
可能SELECT
包含聚合函数。
SELECT z1.id sid1,z2.id sid2,SQRT(POW(ABS(z1.col-z2.col),2) + POW(ABS(z1.row-z2.row),2)) r
FROM stars z1,stars z2
WHERE z1.id != z2.id
HAVING r <= 32
ORDER BY z1.id,z2.id
但请注意,该HAVING
子句很可能不会在索引中使用。您可以为该WHERE
子句提供一个近似术语以用于索引目的:
SELECT z1.id sid1,z2.id sid2,SQRT(POW(ABS(z1.col-z2.col),2) + POW(ABS(z1.row-z2.row),2)) r
FROM stars z1,stars z2
WHERE z1.id != z2.id
AND (z2.col BETWEEN z1.col-32 AND z1.col+32)
AND (z2.row BETWEEN z1.row-32 AND z1.row+32)
HAVING r <= 32
ORDER BY z1.id,z2.id
请注意,瓶颈是磁盘访问,而不是算术计算,因此如果您正在优化速度,您可能希望保留 WHERE 并仅优化 WHERE 子句:
注意
- x^2 与 abs(x)^2 相同。
- x*x 可能比 pow(x,2) 快
- 您可以将另一边平方而不是计算 sqrt。
尝试:
SELECT z1.id sid1,z2.id sid2,
SQRT((z1.col-z2.col)*(z1.col-z2.col) + (z1.row-z2.row)*(z1.row-z2.row)) r
FROM stars z1,stars z2
WHERE z1.id != z2.id
AND (z1.col-z2.col)*(z1.col-z2.col) + (z1.row-z2.row)*(z1.row-z2.row) <= 1024
ORDER BY z1.id,z2.id