问一个查询语句,多谢

唯一完美的番茄 2014-11-17 06:29:50
有两个表结构大概是这样:

表A:
ID NAME PARENTKEY
-------------------------------
1 A NULL
2 B NULL
3 C 1

表B:
NAME HEIGHT WEIGHT
---------------------------------
A 10 10
B 20 20
C 30 30

现在我想查询出如下显示结果

NAME HEIGHT WEIGHT
---------------------------------
A 10 10
B 20 20
A 30 30


字段比较多,只是类比一下,还请见谅。
意思就是如果主键有,就在查询结果的NAME里显示主键ID的NAME,而后面字段不变。
两个表只是根据NAME相连。
之前只会一些简单的查询,对这种需要判断的不知道有没有方法在sql里面处理或是需要参考点什么资料呢?多谢
...全文
322 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 17 楼 roundman 的回复:
[quote=引用 15 楼 lxwankkk 的回复:] [quote=引用 13 楼 roundman 的回复:] 总算理解你的意思了…… 用left join应该可以

select case when a2.id is null then a1.name else a2.name end,weight,height
from a a1
left join a a2
on a1.parentkey = a2.id
left join b
on a1.name = b.name
再次谢谢你的回复,结果集里确实包含了我想要的信息,但还有个小问题。。 查询结果把a表中所有name都显示出来,可是在b中是没有对应的,也就是weight等信息查出来都是null, 可我如果用is not null结果就是0,还是会显示出条目,请问如何过滤? 实际表里表a是一个相对比较大的存储,包含了很多,而b里只有一部分name[/quote] 这个简单,连b表的时候改成inner join

select case when a2.id is null then a1.name else a2.name end,weight,height
from a a1
left join a a2
on a1.parentkey = a2.id
inner join b
on a1.name = b.name
[/quote]

left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 
right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录
inner join(等值连接) 只返回两个表中联结字段相等的行
学习了。。。真心感谢上面所有的朋友! 继续学习ing…… 我想要的结果应该是全部列出b表信息,并在a表中找出对应的,且按照id,parentkey关系列出来,这么看是不是应该用right join更准确?不过也有可能异常删除或修改导致b表里有而a里没有的话如果查出a为null的话好像也不太对,所以保险起见就用inner?
roundman 2014-11-19
  • 打赏
  • 举报
回复
引用 15 楼 lxwankkk 的回复:
[quote=引用 13 楼 roundman 的回复:] 总算理解你的意思了…… 用left join应该可以

select case when a2.id is null then a1.name else a2.name end,weight,height
from a a1
left join a a2
on a1.parentkey = a2.id
left join b
on a1.name = b.name
再次谢谢你的回复,结果集里确实包含了我想要的信息,但还有个小问题。。 查询结果把a表中所有name都显示出来,可是在b中是没有对应的,也就是weight等信息查出来都是null, 可我如果用is not null结果就是0,还是会显示出条目,请问如何过滤? 实际表里表a是一个相对比较大的存储,包含了很多,而b里只有一部分name[/quote] 这个简单,连b表的时候改成inner join

select case when a2.id is null then a1.name else a2.name end,weight,height
from a a1
left join a a2
on a1.parentkey = a2.id
inner join b
on a1.name = b.name
  • 打赏
  • 举报
回复
引用 13 楼 roundman 的回复:
总算理解你的意思了…… 用left join应该可以

select case when a2.id is null then a1.name else a2.name end,weight,height
from a a1
left join a a2
on a1.parentkey = a2.id
left join b
on a1.name = b.name
不知道是不是这么一个逻辑,好像是先遍历了a,然后去b里找;而有的a在b里是没有对应的,就不用显示了,不好意思这个点之前没说清楚
  • 打赏
  • 举报
回复
引用 13 楼 roundman 的回复:
总算理解你的意思了…… 用left join应该可以

select case when a2.id is null then a1.name else a2.name end,weight,height
from a a1
left join a a2
on a1.parentkey = a2.id
left join b
on a1.name = b.name
再次谢谢你的回复,结果集里确实包含了我想要的信息,但还有个小问题。。 查询结果把a表中所有name都显示出来,可是在b中是没有对应的,也就是weight等信息查出来都是null, 可我如果用is not null结果就是0,还是会显示出条目,请问如何过滤? 实际表里表a是一个相对比较大的存储,包含了很多,而b里只有一部分name
WWWWA 2014-11-19
  • 打赏
  • 举报
回复
假设只有1层 SELECT If(c.name Is Null,b.name,c.name) AS 表达式1, a.HEIGHT, a.WEIGHT FROM (a2 AS a LEFT JOIN a1 AS b ON a.NAME = b.NAME) LEFT JOIN a1 AS c ON b.PARENTKEY = c.ID;
roundman 2014-11-19
  • 打赏
  • 举报
回复
总算理解你的意思了…… 用left join应该可以

select case when a2.id is null then a1.name else a2.name end,weight,height
from a a1
left join a a2
on a1.parentkey = a2.id
left join b
on a1.name = b.name
  • 打赏
  • 举报
回复
谢谢各位的回复,现在结果是这样


select case when a1.parentkey is null then a1.name else a2.name end, b.height,b.weight
from a a1,a a2,b
where a1.parentkey=a2.id and a1.name=b.name



我想要的是
name height weight
----------------------------------
a 10 10
b 20 20
a 30 30

else a2.name 好像没出来?
  • 打赏
  • 举报
回复
引用 10 楼 WWWWA 的回复:
应该是递归查询,只取第1层?
多谢回复,不好意思之前不太理解递归查询的意思,大概看了一下,好像也没太了解。。。 但可能表结构是有点树结构的意思,可是查询结果实现的方式,不知道是我哪里没有表述清楚
  • 打赏
  • 举报
回复
引用 19 楼 roundman 的回复:
个人不习惯使用right join 其实right join 和left join一样,只是两张表位置先后关系而已。我习惯使用left join,这样比较符合阅读习惯。 一般都是from 主要的表,left join附属表。 以你要的结果,from b表,left join a表就可以了。
嗯,好,谢谢
roundman 2014-11-19
  • 打赏
  • 举报
回复
个人不习惯使用right join 其实right join 和left join一样,只是两张表位置先后关系而已。我习惯使用left join,这样比较符合阅读习惯。 一般都是from 主要的表,left join附属表。 以你要的结果,from b表,left join a表就可以了。
WWWWA 2014-11-18
  • 打赏
  • 举报
回复
应该是递归查询,只取第1层?
  • 打赏
  • 举报
回复
引用 8 楼 roundman 的回复:
还是没理解楼主的意思…… 就是left join的概念吧? select a.* ,b.weight,b.height from a left join b on a.name = b.name
谢谢回复,你可以看1层的描述,是有条件查询的。 好像不是左连接能得到结果
roundman 2014-11-18
  • 打赏
  • 举报
回复
还是没理解楼主的意思…… 就是left join的概念吧? select a.* ,b.weight,b.height from a left join b on a.name = b.name
WWWWA 2014-11-18
  • 打赏
  • 举报
回复
select case when A.PARENTKEY is null then A1.name else A2.name end ,B.high,B.weight ....
  • 打赏
  • 举报
回复
我用实际表查询也是错误只是到这里,near在第二个表字段那里,一直忙别的事,刚才着手继续弄这个问题。。
  • 打赏
  • 举报
回复
引用 2 楼 rucypli 的回复:
select case when A.PARENTKEY is null then A1.name else A2.name ,B.high,B.weight
from A A1,A A2,B
where A1.PARENTKEY=A2.id and A1.name=B.name


查询如图,mysql版本是5.5.17
WWWWA 2014-11-18
  • 打赏
  • 举报
回复
递归查询?有多少层?
  • 打赏
  • 举报
回复
引用 2 楼 rucypli 的回复:
select case when A.PARENTKEY is null then A1.name else A2.name ,B.high,B.weight from A A1,A A2,B where A1.PARENTKEY=A2.id and A1.name=B.name
感谢版主回复 家里没电脑,我去学学case when,明天试一下!先谢谢了
rucypli 2014-11-17
  • 打赏
  • 举报
回复
select case when A.PARENTKEY is null then A1.name else A2.name ,B.high,B.weight from A A1,A A2,B where A1.PARENTKEY=A2.id and A1.name=B.name
  • 打赏
  • 举报
回复
果然大家都下班了嘛。。。好吧,明天静等

57,064

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧