самостоятельное соединение (внутреннее соединение) генерирует декартово произведение - PullRequest
0 голосов
/ 25 января 2020

Данные

origin  OP_CARRIER_AIRLINE_ID
ATL     19790
ATL     19790
ATL     19790
ATL     19790
ATL     19790
ATL     19790
ATL     19790
ATL     19790
ATL     19790
ATL     19790

BWI     19790
BWI     19790
BWI     19790
BWI     19790
BWI     19790
BWI     19790
BWI     19790

В данных, которые у меня есть, я пытаюсь найти правильный способ сопоставления в следующем формате

Origin[Airlines]Origin 

Я пытаюсь создать связь между два города, скажем, первый источник - город происхождения, а второй источник - город назначения.

select origin, a.OP_CARRIER_AIRLINE_ID, count(*) cnt 
from a_Dec a 
where a.OP_CARRIER_AIRLINE_ID= '19790 'and a.origin ='ATL' 
group by origin, a.OP_CARRIER_AIRLINE_ID

Я получаю

origin  OP_CARRIER_AIRLINE_ID   cnt
ATL    19790                    19201

, что правильно, то есть в ATL было совершено 19201 рейсов.

Теперь я хочу обработать второй источник как пункт назначения, и я использовал следующий запрос

select a.OP_CARRIER_AIRLINE_ID, a.origin, b.origin,  count(*) cnt  
from  [dbo].[a_Dec] a  
left join  [dbo].[a_Dec] b 
  on (a.OP_CARRIER_AIRLINE_ID = b.OP_CARRIER_AIRLINE_ID)
where a.OP_CARRIER_AIRLINE_ID is not null  
  and a.origin is not null 
group by a.OP_CARRIER_AIRLINE_ID, a.origin, b.origin
having count(*)> 1
order by cnt desc

Пример результата

OP_CARRIER_AIRLINE_ID   origin  origin  cnt
19790                    ATL    ATL 368678401
19805                    DFW    DFW 141158161
19790                    MSP    ATL 96389020
19790                    ATL    BWI 96389020

368678401 - результат выше 19201*19201, который по существу является декартовым произведением.

это неправильный запрос, я знаю, но как я смогу сформировать отношения для этого? На самом деле, строка

19790 ATL ATL 368678401 или 19805 DFW DFW 141158161 даже не должна существовать в результате. Обратите внимание, что это по сути создает egde, как вызывается в базе данных графа, но в ситуации, когда нет доступной базы данных графа, как мы можем решить эту загадку простым sql?

...