Объединить несколько таблиц без общего ключа - PullRequest
1 голос
/ 27 января 2020

Я работаю над проектом по созданию процесса ETL, но застрял на 1 проблеме, где мне нужно вставить данные в таблицу измерений, используя 3 разные таблицы, не имея общего ключа, с помощью которого я могу объединять таблицы. Я пытался решить эту проблему с помощью CTE, но безрезультатно.

Таблица землетрясений с данными

enter image description here Таблица землетрясений

Таблица городов с данными

enter image description here Таблица городов

Таблица стран с данными

enter image description here Таблица стран

** Что я пытаюсь сделать ** Мне нужно найти город, страну и регион мира, где произошло землетрясение, и сохранить полученные значения в разных таблицах. Итак, используя формулу, которая вычисляет расстояние между указанными местоположениями. Первое местоположение, которое я беру из таблицы землетрясений, и второе местоположение из широты и долготы города.

( 6371 * acos( cos( radians(E.Latitude) ) * cos( radians( C.Latitude ) ) *  cos( radians( C.Longitude) - radians(E.Longitude) ) + sin( radians(E.Latitude) ) * sin( radians( C.Latitude ) ) ) )   < 100 

Здесь C.Latitude - широта города, а E.Latitude - широта, где это произошло.

Это мой бесполезный подход CTE.

WITH Test_CTE (
    Latitude
    ,Longitude
    ,City
    ,Country
    ,Region
    ,Place
    )
AS (
    SELECT E.Latitude
        ,E.Longitude
        ,C.City
        ,C.Country
        ,Cntry.Region
        ,Cast(E.place AS VARCHAR(50))
    FROM Earthquake AS E
        ,(
            SELECT Latitude
                ,Longitude
                ,Country
                ,City
            FROM City
            ) AS C
        ,(
            SELECT Country
                ,Region
            FROM Country
            ) AS Cntry
    WHERE (6371 * acos(cos(radians(E.Latitude)) * cos(radians(C.Latitude)) * cos(radians(C.Longitude) - radians(E.Longitude)) + sin(radians(E.Latitude)) * sin(radians(C.Latitude)))) < 100
        AND Cntry.Country = C.Country
    )
SELECT *
FROM Test_CTE

, который дает этот результат

enter image description here Результат

Примечание: колонка другие, тогда Город повторяется слишком много раз.

Мои ожидания: В каждой строке таблицы землетрясений есть только 1 ближайший соответствующий город, страна из города, регион из таблицы стран и место из таблицы землетрясений.

Я не работал с таблицами без общего ключа, поэтому понятия не имею, почему и чем вызвана эта проблема. Кто-нибудь может мне помочь? Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 27 января 2020

В качестве альтернативы

Используйте Split String UDF, чтобы разделить столбец Place таблицы EarthQuake.

;with CTE as
(
select EQ.*,SScol from EarthQuake EQ
cross apply(select col split_string(Place,' ')SS )SS
)
,CTE1 as
(
select Ct.*,c.country,c.city from CTE ct
left join City C on ct.col=c.country
)
,CTE2 as
(
select Ct.*,c.country,c.city from CTE1 ct
left join City C on ct.col=c.city
)

Это даст вам идею укрепить таблицу City и Country .

Я не знаю, требуется ли таблица Country или нет.

Или вы можете запустить, чтобы увидеть, сколько данных отсутствует, у которых нет city или country и ПОЧЕМУ?

Таким образом, вы можете создать алогрит.

0 голосов
/ 27 января 2020

Как насчет этого?

SELECT  E.Latitude
        ,E.Longitude
        ,C.City
        ,C.Country
        ,Cntry.Region
        ,Cast(E.place AS VARCHAR(50))
FROM Earthquake E
CROSS APPLY
(
    SELECT TOP 1 City
    FROM City
    WHERE (6371 * acos(cos(radians(E.Latitude)) * cos(radians(C.Latitude)) * cos(radians(C.Longitude) - radians(E.Longitude)) + sin(radians(E.Latitude)) * sin(radians(C.Latitude)))) < 100
    ORDER BY (6371 * acos(cos(radians(E.Latitude)) * cos(radians(C.Latitude)) * cos(radians(C.Longitude) - radians(E.Longitude)) + sin(radians(E.Latitude)) * sin(radians(C.Latitude)))) ASC
) City
INNER JOIN City C
    ON City.City = C.City
INNER JOIN Country Cntry
    ON C.Country = Cntry.Country

Идея состоит в том, чтобы использовать CROSS APPLY, чтобы получить ближайший город для определения c землетрясения. Затем с помощью INNER JOIN получите данные.

Вы можете использовать OUTER APPLY для просмотра записей, которые не находятся ближе всего к 100 городам.

...