SQL 的 join 搞不明白了,求解释

2019-06-27 09:29:12 +08:00
 wozhizui

目前有三张表: 描述表 A(no,name1)[上万],业务数据表 B(no,...,info,)[共两记录条],描述表 C(no,address)[一条]。

select a~no, 
from A
inner join B
on A~no = b~no
inner(or left or right) join C
on B~no = C~no
where ...
into ...

目前想达到的效果是两条记录,都有 name1,一条记录有 adress,一条没有 address。 因为是二次开发,表结构是不可更改的。

3071 次点击
所在节点    问与答
21 条回复
tankren
2019-06-27 10:04:40 +08:00
ABAP????
jay0726
2019-06-27 10:12:42 +08:00
没明白啥意思 三张表联合查询查出两条数据,一条要有 address,一条 address 为空???
zz656565
2019-06-27 10:17:18 +08:00
select A.no,A.name1,C.address
from A
inner join B
on A.no = B.no
left join C
on A.no = C.no
where ...
into ...
ourzhang
2019-06-27 10:21:00 +08:00
A inner join B left join C
c4f36e5766583218
2019-06-27 10:21:50 +08:00
没看懂问题。。。我假设

表 A 里有数据
A.no1, A.name1
A.no2, A.name2
...
A.no3, A.name3
表 B 里有数据
B.no1, B.info1
B.no2, B.info2
表 C 里有数据
C.no1, C.address1
上面的各表的 no1=no1, no2=no2

比如 select * from A right join B on A.no=B.no left join C on B.no=C.no; 查出来如下
no1, name1, no1, info1, no1, address1
null, null, no2, info2, null, null

你列一下你想要查到什么样效果的结果?按我给出的样式
zzcworld
2019-06-27 10:36:55 +08:00
记住要先用 inner join 再用 left join,因为始终都是以第一章表( select from 的)为基准。inner join 的有地址,left join 的没有地址
ayumilove
2019-06-27 10:37:20 +08:00
如果是 Oracle 可以 用 rownum 实现。
ayumilove
2019-06-27 10:58:03 +08:00
select
a.no,
c.address
from (select
rownum ron,
no
from b
where no ='XXXXXXX'
order by no) b
left join c
on a.no = c.no
and a.ron=1;

查询结果 为
no address
XXXXXXX 中国
XXXXXXX
c4f36e5766583218
2019-06-27 13:21:25 +08:00
https://www.v2ex.com/t/577872?p=1#r_7543598 写错了 fix
比如 select * from A join B on A. no=B. no left join C on B. no=C. no; 查出来如下
no1, name1, no1, info1, no1, address1
no2, name2, no2, info2, null, null
muchengxue
2019-06-27 14:59:07 +08:00
相信回答的人,更喜欢你用几张 demo 表,更好回答
wozhizui
2019-06-27 15:53:57 +08:00
@tankren 这都能看出来?
wozhizui
2019-06-27 15:54:14 +08:00
@jay0726 是这个意思
wozhizui
2019-06-27 15:56:18 +08:00
@c4f36e5766583218
no1, name1, info1, address1
no2, name2,, info2, null
tankren
2019-06-27 15:58:12 +08:00
@wozhizui 我做 SAP 的 只懂 ABAP,哈哈哈
wozhizui
2019-06-27 15:58:47 +08:00
@ayumilove 不是 oracle,不能这么实现。
wozhizui
2019-06-27 15:59:59 +08:00
@tankren 是 abap,第二个 data 表是+data( select * from ... into zdata as b),所以只能这个顺序写。
wozhizui
2019-06-27 16:14:50 +08:00
## demo 表
#### 1. A 表-描述表

no | name
---|---
1 | 小李
2 | 小王
... | ...
10000 | 小王

#### 2. B 表-业务数据表

no | info1 | info2
---|---|---
1 | info1 | info2
2 | info1 | info2

#### 3. C 表-描述表 2
no | adress
---|---
1 | 云南

#### result 表
no | info1 | info2 | name | adress
---|---|---|---|---
1 | info1 | info2 | 小李 | 云南
2 | info1 | info2 | 小王 | null
c4f36e5766583218
2019-06-27 16:27:26 +08:00
https://www.v2ex.com/t/577872?p=1#r_7545691
那不就是最简单的多表查询问题。有什么疑问吗?
select A. no , B. info1, B. info2, A. name , C. address from A join B on A. no=B. no left join C on B. no=C. no
tankren
2019-06-27 16:29:59 +08:00
select a~no b~info1 b~info2 a~name c~address
from zxxx1 as a
inner join zxxx2 as b
on b~no = a~no
inner join zxxx3 as c
on c~no = a~no
into itab1
for all entries in xxxx
where xxxxx
jay0726
2019-06-27 16:31:13 +08:00
select
a.no,
b.info1,
b.info2,
a.name,
c.address
from a
inner join b
on a.no = b.no
left join c
on c.no = a.no

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/577872

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX