你不能指在一個WHERE
子句SELECT
條款定義的別名,但你可以在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子句:
注意到
- 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
我不擔心數學運算的表現。 –
我並不確定,但是當你爲SQRT(POW(ABS(z1.col-z2.col),2)+ POW(ABS(z1.row-z2.row))創建一個別名'r'時, 2)),你不能只是做'AND r <= 32'嗎? –
@Kohányi一直在嘗試,但不能得到它的工作 – Mahks