加入后为什么我有这么多记录?

时间:2019-03-13 17:10:47

标签: sql sql-server join view left-join

我正在尝试连接两个表;一个报告媒体活动的信息,另一个报告电视节目的信息...因为第二个表不包含任何有关运动的信息,并且由于我现在真的不需要它,所以我将根据电视广告(此处为“ creative_id”)和日期。

问题是,大约有。第一张表中有670万条记录,所以我不明白为什么,当我运行此表时,我得到了超过1700万条记录... :(您能帮忙吗?

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 个答案:

答案 0 :(得分:2)

这是两个表:

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中的每一行,结果是我们从A中的3行,B中的3行开始,如果它们是1:1,我们将有3行结果集,但是因为3行匹配另外3行,我们得到9行结果(3 * 3)。

只要您的一个表中的行与另一张表中的多行匹配,根据您的联接条件,结果行数就会增加/成倍增加

答案 1 :(得分:0)

最常见的情况是,连接表中有多个记录满足连接条件(谓词)。如果您的谓词在第二张表上不是唯一的,则记录将在左联接时重复。