2012-10-17 58 views
1

我有一個查詢,我正在測試一個'IN'對選擇。操作數應該包含1列在哪裏有

我得到一個「操作數應該包含1列」的錯誤,我認爲是因爲我在'IN'選擇中選擇了多於1列。我需要將第二列作爲我的選擇器的一部分,因爲我需要檢查它是否有'有'語句。

我該如何使這項工作得到我想要的效果?

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 
     ); 

回答

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 
); 
+0

我愛你,想要你的寶寶。謝謝! – Fraser

0

你想做什麼不能做。 IN子查詢必須返回單個列。

我的建議是,您將表LINSTING添加到連接鏈,然後詢問Listing.ID is not null

另請參見:HAVING用於具有GROUP BY子句的查詢。

+0

感謝您的回覆。當我運行獨立於主查詢的子查詢時,它正確地返回 – Fraser

+0

後的結果當然,但是當IN子句的一部分(子查詢必須返回單個列)時,因爲無法將單個列與幾個列進行比較列。基本上,一個IN子句將外部查詢的一列與內部列的一列進行比較。 SQL無法比較ID和ID與距離。 –

相關問題