2016-11-17 46 views
-1

假设我们有三个表,一个用于人(person_id,person_name,street_name,...),一个用于城市区(district_id,district_name,...),另一个用于区 - 街道1-N对(district_id,street_name)。我想选择不住在特定区域(由district_name标识)的人员(T-SQL环境)。SQL高效地实施而不是任何

SELECT P.Person_id 
    FROM persons P 
    JOIN Districts D on D.Name='1. district' 
    JOIN Districts_Streets S on S.District_ID=D.District_ID 
    WHERE ???? 
+2

p和d之间没有连接条件? – jarlh

+1

_efficient_的指标是什么?查询中最少的字符?最小化I/O? ... – HABO

+0

@HABO执行时间是关键。 –

回答

4

不会<>做你想做的?

SELECT P.Person_id 
FROM persons P JOIN 
    Districts_Streets S 
    ON P.street_name = S.street_name JOIN 
    Districts D 
    ON S.District_ID = D.District_ID 
WHERE D.Name <> '1. district'; 

您确实需要正确设置连接。

+0

另一种解决方案是: SELECT P.PersonID FROM人员P LEFT JOIN (SELECT S.Street_Name FROM Districts_Streets小号 INNER JOIN区d ON D.District_ID = S.District_ID WHERE D.Name <>“1。区'')L ON L.Street_Name = P.Street_Name WHERE L.Street_Name IS NULL –

+0

问题是:哪个是T-SQL环境中最高效的... –

+0

@ZoltanHernyak。 。 。为什么你会用这个简单的逻辑使用'LEFT JOIN'? –