Почему у меня так много записей после объединения? - PullRequest
0 голосов
/ 13 марта 2019

Я пытаюсь объединить две таблицы;одна содержит информацию о кампаниях в СМИ, а другая - по телевизионным роликам ... Поскольку вторая таблица не содержит никакой информации о кампаниях, и поскольку она мне сейчас не нужна, я объединяю две таблицы на основе идентификатораТВ ролик (здесь «creative_id»), а также дата.

Проблема в том, что есть ок.6,7 миллиона записей в первой таблице, поэтому я не понимаю, почему, когда я запускаю это, я получаю более 17 миллионов ... :( Можете ли вы помочь, пожалуйста?

alter view halo2 as
select
h.date,h.channel,h.strategy,h.creative_id,h.programme,h.sub_programme,h.l_c_b,
h.media_plan_split,h.pu,h.conversion_type,h.conversion_new_or_upgrade,
case when h.conversion_new_or_upgrade like '%new%' then 1 else 0 end #acquisitions,
case when h.conversion_new_or_upgrade like '%upg%' then 1 else 0 end #upgrades,
case when h.conversion_contract_length like '%12%' then 12
when h.conversion_contract_length like '%24%' then 24
when h.conversion_contract_length like '%30%' then 1
else 0 end contract_length_in_months,
h.conversion_device_manufacturer,
h.conversion_device,
h.media_spend,
h.#halo,
ft.u10/100 as upfront_cost,
(ft.sales_value+cast(ft.u28 as float))/100 as monthly_cost
from halo h left join in_ft_conversion ft
on h.creative_id=ft.creative_id 
and
h.date=ft.sales_date

Ответы [ 2 ]

2 голосов
/ 13 марта 2019

Вот две таблицы:

TableA
Number, Text
----
1, Hello
1, There
1, World


TableB
Number, Text
----
1, Foo
1, Bar
1, Baz

Вот запрос, который присоединяется к ним:

SELECT * FROM TableA a INNER JOIN TableB b ON a.Number = b.Number

Вот результаты:

a.Number, a.Text, b.Number, b.Text
----------------------------------
1, Hello, 1, Foo
1, Hello, 1, Bar
1, Hello, 1, Baz
1, There, 1, Foo
1, There, 1, Bar
1, There, 1, Baz
1, World, 1, Foo
1, World, 1, Bar
1, World, 1, Baz

Это называется декартовым произведением; между A и B нет отображения 1: 1 или даже 1: Many, существует отображение Many: Many. Каждая строка в A соответствует каждой строке в B, в результате мы начали с 3 строк в A, 3 строк в B, если бы они были 1: 1, у нас был бы набор из 3 строк, но потому что каждый из 3 строки соответствуют еще 3-м строкам, мы получили результат в 9 строк (3 * 3).

Каждый раз, когда в одной из ваших таблиц есть строки, которые соответствуют более чем одной строке другой таблицы, в соответствии с вашим условием соединения, получаемый вами счетчик строк будет увеличиваться / умножаться

0 голосов
/ 13 марта 2019

Наиболее распространенная ситуация - у вас есть более одной записи в объединенной таблице, которая удовлетворяет условию соединения (Предикат). Если ваш предикат не уникален во второй таблице, записи будут повторяться при левом соединении.

...