【问题标题】:sql join joining 3 tablessql join 加入3个表
【发布时间】:2016-10-14 13:17:13
【问题描述】:

这个有点奇怪……

有人写了一个我认为不应该工作的sql,但它确实可以,并且它也返回了正确的结果。我写了一个简化的例子,但我认为它说明了这一点。

drop table #client;
drop table #transactions;
drop table #history;

create table #client (
    clientId int,
    name varchar(50)
);
create table #transactions (
    transid int,
    clientId int,
    Amount int
);
create table #history (
    transid int,
    Amount int
);

insert into #client values (1, 'User 1');
insert into #client values (2, 'User 2');
insert into #client values (3, 'User 3');

insert into #transactions values (1, 1, 50);
insert into #transactions values (2, 1, 35);
insert into #transactions values (3, 1, 25);

insert into #transactions values (4, 2, 10);
insert into #transactions values (5, 2, 50);
insert into #transactions values (6, 1, 35);
insert into #transactions values (7, 3, 25);
insert into #transactions values (8, 3, 10);

insert into #history values (1, 50);
insert into #history values (2, 35);
insert into #history values (3, 25);
insert into #history values (4, 10);
insert into #history values (5, 50);
insert into #history values (6, 35);
insert into #history values (7, 25);
insert into #history values (8, 10);

select * from #history
join #transactions on #history.transid = #transactions.transid
join #client on #transactions.clientId = #client.clientId and #history.transid = #transactions.transid

最后一个联接在一个联接中将 3 个表连接在一起,根据我对编写 SQL 的了解,这不应该起作用。我错了吗(很可能是这样)

【问题讨论】:

  • 你错了。 on 子句可以包含对已定义的任何表/子查询的引用。
  • 嗯..不知道..谢谢。但是,如果您想在图表上绘制它,则从 2 个(或更多)表到 1 个表中会有线条。但我相信您的说法,它是一个有效的连接。

标签: sql


【解决方案1】:

为什么你认为它不应该工作? 不过,查询的最后一点毫无意义,您可以将其取出。这是对 3 个表的简单连接:

select * from #history
join #transactions on #history.transid = #transactions.transid
join #client on #transactions.clientId = #client.clientId

【讨论】:

  • 是的,我知道我可以取出最后一个连接...我的示例再次非常简化:)
猜你喜欢
  • 1970-01-01
  • 2019-06-14
  • 2015-10-26
  • 2020-09-15
  • 2021-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-10
相关资源
最近更新 更多