【问题标题】:Why am I having so many records after a join?为什么加入后我有这么多记录?
【发布时间】:2019-03-13 17:10:47
【问题描述】:

我正在尝试加入两个表;一个是关于媒体活动的报道信息,另一个是关于电视广告的报道......因为第二个表格不包含任何关于活动的信息,而且我现在真的不需要它,所以我将根据电视广告(此处为“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

【问题讨论】:

  • 因为你有一对多的关系。如果您对另一个有多个匹配项的表执行JOIN,则每个匹配项您将收到 1 行;不是所有的 1 行。
  • JOINs 的工作原理差不多。它们将一个表中的行与另一个表中的零、一或多行相关联。
  • 这个不清楚。请给minimal reproducible example。通过参考文档来解释您认为 LEFT JOIN 的合理性以及您认为这不是您所得到的。 PS 了解什么是左连接返回:行内连接加上由空值扩展的不匹配左表行。作为左连接的一部分,始终知道您想要什么内连接。 PS 考虑表的 PK/UNIQUE 和 FK。

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


【解决方案1】:

这里有两张表:

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)。

只要您的一个表的行与另一个表的多行匹配,根据您的连接条件,您的结果行数将增加/成倍

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 好吧,那个连接中有两个谓词;它不一定是唯一的 creative_id 问题
    • 你是对的!谓词中有更多字段。
    猜你喜欢
    • 2013-02-09
    • 2014-06-28
    • 2019-08-28
    • 1970-01-01
    • 1970-01-01
    • 2021-04-21
    • 2020-08-22
    • 2013-12-21
    • 2023-04-11
    相关资源
    最近更新 更多