2016-11-17 5 views
-1

Предположим, у нас есть три таблицы: одна для лиц (person_id, person_name, street_name, ...), одна для городских районов (район_ид, район_имя, ...) и одна для района -streets 1-N пар (district_id, street_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_? Немного символов в запросе? Минимизация ввода-вывода? ... – 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

Другим решением является: ВЫБОР P.PersonID от человека P LEFT JOIN (SELECT S.Street_Name ОТ Districts_Streets S INNER JOIN Районы D ВКЛ D.District_ID = S.District_ID ГДЕ D.Name <> '1. район ') L ON L.Street_Name = P.Street_Name WHERE L.Street_Name IS NULL –

+0

Вопрос в том, что является наиболее эффективным в среде T-SQL ... –

+0

@ZoltanHernyak. , , Зачем вам использовать «LEFT JOIN» для такой простой логики? –

Смежные вопросы