2017-02-22 12 views
0

Я работаю над данными о транспортировке.Найти отсутствующий маршрут в SQL Server

Origin Destination (... other columns) 
CityA CityB 
CityA CityC 

Я хочу, чтобы выяснить, не хватает пары происхождения-назначения встречи следующего набора:

  1. Если мы имеем cityâ (происхождение) -> CityB (назначения), но мы не имеем CityB (изначальный) -> CityA (пункт назначения), затем выведите CityB (происхождение) -> CityA (пункт назначения).
  2. Если у нас есть CityA (origin) -> CityB (пункт назначения), и у нас есть CityB (origin) -> CityA (destination), то ничего не выводится.

Образец intput: выход

Origin Destination (... other columns) 
CityA CityB 
CityA CityC 

Пример:

Origin Destination (... other columns) 
    CityB CityA 
    CityC CityA 

Что я пробовал:

with t1 as (
select distinct t.ofips, t.dfips 
from table t 
), 

t2 as (
select distinct t.ofips, t.dfips 
from table t 
), 

t3 as (
select distinct t1.ofips, t1.dfips 
from t1 
inner join t2 
on t1.ofips = t2.dfips 
and t1.dfips = t2.ofips 
), 

t4 as (
select distinct t1.ofips, t1.dfips 
from t1 
left join t3 
on t1.ofips = t3.ofips 
and t1.dfips = t3.dfips 
where t3.ofips is null or t3.dfips is null 
)--, 
select * from t4 

Однако результаты кажутся неправильными. Что не так с кодом? Я что-то упускаю?

Примечание: Производительность является проблемой, потому что стол довольно большой.

ответ

1

Вы можете использовать NOT EXISTS:

SELECT 
    t1.dfips AS Origin, 
    t1.ofips AS Destination 
FROM t t1 
WHERE NOT EXISTS(
    SELECT 1 
    FROM t t2 
    WHERE 
     t2.ofips = t1.dfips 
     AND t2.dfips = t1.ofips 
); 

ONLINE DEMO

1

Как об этом?

select t.destination as origin, t.origin as destination 
from t 
where not exists (select 1 
        from t t2 
        where t2.origin = t.destination and t2.destination = t.origin 
       ); 

Я не уверен, что делает ваш запрос, но он кажется слишком сложным.

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