【问题标题】:SQL Join based on three keys基于三个键的 SQL Join
【发布时间】:2015-12-13 06:35:30
【问题描述】:

数据库是 Teradata

我有两个要加入的表。以下是表结构。当我加入这些表时,我希望得到两行作为输出,但得到 4 行。这种行为的原因是什么。基于三个键的连接应该唯一地标识一行,但仍然得到 4 行作为输出。任何帮助表示赞赏。

TableA
Weekkey|segment|type|users
201501|1|A|100
201501|1|B|100
TableB
Weekkey|segment|type|revenue
201501|1|A|200
201501|1|B|200

当我使用以下查询加入这两个表时,我得到以下结果

select a.* ,b.user
from tablea a left join  tableb b on a.weekkey=b.weekkey 
and  a.segment=b.segment
and  a.type=b.type

Weekkey|segment|type|revenue|users
201501|1|A|200|100
201501|1|B|200|100
201501|1|A|200|100
201501|1|B|200|100

【问题讨论】:

  • 您使用的是哪个数据库?
  • 使用 sql server 和你发布的数据和查询是不可能的。
  • 我假设(通过查看表名)这是一个示例查询。你确定你没有重用别名?比如:a.type = a.type
  • 另外,根据您的示例数据,您的 users 列在 TableA 中,而您的查询则不然。
  • 数据库是 terdata。我没有使用任何重复的别名。

标签: join teradata


【解决方案1】:

使用 sql server,这里是 ddl 和示例数据以及您发布的查询。你说你得到的输出不会在这里发生。

create table #tablea
(
    Weekkey int
    , segment int
    , type char(1)
    , users int
)

insert #tablea
select 201501, 1, 'A', 100 union all
select 201501, 1, 'B', 100

create table #TableB
(
    Weekkey int
    , segment int
    , type char(1)
    , revenue int
)
insert #TableB
select 201501, 1, 'A', 200 union all
select 201501, 1, 'B', 200

select a.* 
    , b.revenue
from #tablea a 
left join #tableb b on a.weekkey = b.weekkey 
and a.segment = b.segment
and a.type = b.type

drop table #tablea
drop table #TableB

【讨论】:

  • 数据库是 terdata。当我联系所有三个键并加入时,我没有得到重复
  • 此查询有效。这是 teradata 特定行为吗? select a.* ,b.user from tablea a left join tableb b on a.weekkey|| a.segment||a.type=b.weekkey|| b.segment||b.type
  • 您使用多个 DBMS 标记了您的问题。正如我在帖子中所说,这是针对 sql server 的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-22
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 2016-09-20
相关资源
最近更新 更多