2013-01-19 51 views
1

我有table1table2SQL Server - 兩個查詢的交集,都使用WHERE子句

table1 contains ZipCode (varchar(12)), GeogCol1 (Geography)-spatial index 
table2 contains ZipCode (varchar(12)), Product (varchar(12)) 

我需要從提供Zipcode ('90266')用戶即假定是包含兩個表中的某一半徑內歸還所有Product's,從Zipcode每個顯示distance返回Product並給用戶排序或的選擇將Productsdistance反向排序至提供的Zipcode

查詢1 - 這是我的半徑距離查詢:

SELECT h.* 
FROM table1 g 
JOIN table1 h on g.Zipcode <> h.Zipcode AND g.Zipcode = '90266' AND h.Zipcode <> '90266' 
WHERE g.GeogCol1.STDistance(h.GeogCol1)<=(10 * 1609.344) 
ORDER BY g.GeogCol1.STDistance(h.GeogCol1) 

查詢2 - 這是我的產品查詢:

SELECT * 
FROM table2 
WHERE (Active = 1) AND (ProductName LIKE '%54%') 

而且,豈不是更好,如果我一起把GeogCol1空間索引中table2與每個產品的其他信息,以便查詢可以完成對單個表?

回答

1

首先,您的第一個查詢將排除當前的郵政編碼,因此即使郵政編碼中可用,我也沒有去下一個郵政編碼來獲取該產品。對我來說看起來不太合適。

反正

SELECT t2.Zipcode 
     ,t2.Product 
FROM table1 g 
    INNER JOIN 
    table1 h ON g.Zipcode <> h.Zipcode 
       AND 
       g.Zipcode = '90266' 
    INNER JOIN 
    table2 t2 ON (t2.Active=1) 
        AND 
        (t2.ProductName LIKE '%54%') 
        AND 
        g.Zipcode=t2.Zipcode 
WHERE g.GeogCol1.STDistance(h.GeogCol1)<=(10 * 1609.344) 
ORDER BY g.GeogCol1.STDistance(h.GeogCol1) 

在自聯接第三個條件是由所述第一條件是多餘的。

不要把它們放在同一個表中 - 你會使數據非規範化。

+0

我認爲這仍然存在問題:什麼是正確的索引或指數集以確保此查詢速度快? –