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

问题描述 投票:-1回答:2

我想加入两张桌子;一个报道有关媒体活动的信息,另一个报道有关电视广告的信息......因为第二个表格中没有任何关于广告系列的信息,而且因为我现在不需要它,所以我根据其中的ID加入这两个表格。电视广告(这里,“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
sql sql-server join view left-join
2个回答
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:许多映射,有很多:很多映射。 A中的每一行都映射到B中的每一行,结果我们开始用A中的3行,B中的3行,如果它们是1:1我们有3行结果集,但因为每3行行匹配另外3行,我们得到了9行结果(3 * 3)。

每当你的一个表的行与另一个表的多行匹配时,根据你的连接条件,你得到的行数会增加/乘以


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.