操作数应包含1列在哪里

时间:2012-10-17 02:03:50

标签: sql

我有一个查询,我正在测试一个'IN'对抗一个选择。

我得到一个“操作数应该包含1列”错误,我认为是因为我在'IN'选择中选择了多于1列。我需要第二列作为选择器的一部分,因为我需要根据'having'语句检查它。

我如何才能使这项工作达到预期效果?

SELECT DISTINCT c.ID, Title, URLSegment
FROM ListingCategory c
LEFT JOIN SiteTree_Live ON c.ID = SiteTree_Live.ID
JOIN ListingCategory_Listings lc
      ON c.ID = lc.ListingCategoryID
        WHERE lc.ListingID IN (
            SELECT Listing.ID,
( 6371 * ACOS( COS( RADIANS(-45.0227996) ) * COS( RADIANS( Location.Latitude ) ) * COS( RADIANS( Location.Longitude ) - RADIANS(168.6991149) ) + SIN( RADIANS(-45.0227996) ) * SIN( RADIANS( Location.Latitude ) ) ) ) AS distance
FROM Listing
LEFT JOIN Location ON Listing.LocationID = Location.ID
having distance < 5
        );

2 个答案:

答案 0 :(得分:1)

简单 - 只是不要选择计算列。此外,它应该是WHERE,而不是HAVING

...
WHERE lc.ListingID IN (
    SELECT Listing.ID
    FROM Listing
    LEFT JOIN Location ON Listing.LocationID = Location.ID
    WHERE 6371 * ACOS( COS( RADIANS(-45.0227996) ) * COS( RADIANS( Location.Latitude ) ) * COS( RADIANS( Location.Longitude ) - RADIANS(168.6991149) ) + SIN( RADIANS(-45.0227996) ) * SIN( RADIANS( Location.Latitude ) ) )
        < 5
);

答案 1 :(得分:0)

你想做什么是不可能完成的。 IN子查询必须返回单个列。

我的建议是将表LINSTING添加到连接链,然后询问Listing.ID is not null

另外:HAVING用于具有GROUP BY子句的查询。