查询优化如何

时间:2012-01-09 13:39:58

标签: sql sql-server

在我的脚本中,我将对象ID作为查询字符串参数传递。比如?idobject=1962

首先,我必须从OBJECTS表格访问GeoLatGeoLng列 我必须再次检查是否有其他对象包含相同的Geo Data

SELECT GeoLng, GeoLat
FROM OBJECTS
WHERE ID = 1962   

从上面的查询我必须阅读GeoLngGeoLat变量,并且必须编写第二个查询,如下所示

SELECT O.ID
FROM OBJECTS O
WHERE GeoLng = '12.72812515' /* will be taken from above query */
AND GeoLat   = '47.7794388' /* will be taken from above query */

AND EXISTS(
    SELECT ID 
    FROM InfObjects 
    WHERE ID = O.ID
    )

我可以将这两个查询写入单个查询吗? 感谢

3 个答案:

答案 0 :(得分:5)

修改:根据Rich的评论更新。

您需要的是自我加入。

SELECT O2.ID
FROM OBJECTS O1
JOIN OBJECTS O2 on O1.GeoLng = O2.GeoLng AND O1.GeoLat = O2.GeoLng
WHERE O1.ID = 1962   
AND EXISTS(
    SELECT ID 
    FROM InfObjects 
    WHERE ID = O2.ID
)

甚至更有效率,像这样:

SELECT O2.ID
FROM OBJECTS O1
JOIN OBJECTS O2 on O1.GeoLng = O2.GeoLng AND O1.GeoLat = O2.GeoLng
JOIN InfObjects I ON O2.ID = I.ID
WHERE O1.ID = 1962   

答案 1 :(得分:3)

坚持使用“EXISTS”表达式,您可以执行以下操作:

SELECT O.ID
FROM OBJECTS O
AND EXISTS (
    SELECT ID 
    FROM InfObjects 
    WHERE ID = O.ID
)
AND EXISTS (
    SELECT 1
    FROM OBJECTS o2
    WHERE o2.GeoLng = O.GeoLng AND o2.GeoLat = O.GeoLat AND o2.ID = 1962
)

您也可以使用内部联接而不是相关查询来执行此操作,但我认为此语法也应该产生足够高性能的查询。

答案 2 :(得分:3)

SELECT O.ID
FROM OBJECTS OID
INNER JOIN Objects O ON O.GeoLng = OID.GeoLng AND O.GeoLat = OID.GeoLat
WHERE OID.ID = 1962
AND EXISTS(
    SELECT ID 
    FROM InfObjects 
    WHERE ID = OID.ID
    )