关于表n关联的问题。

Roc_Lee 2009-12-25 02:09:02
现在有表A 产品表
id 名称
1 可口可乐

表B 产品属性表
id A_id A_Name
1 1 容量
2 1 口味


表C 产品属性对应表
id B_id value
1 1 500ml
2 1 1000ml
3 2 原味
4 2 无糖


怎么写查询语句可以查出如下结果

可口可乐 原味500ml 原味1000ml 无糖500ml 无糖1000ml
...全文
158 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
Roc_Lee 2009-12-25
  • 打赏
  • 举报
回复
也考虑这个问题 了。但是没有想到好的办法。现在光想库设计了。没有考虑效率
--小F-- 2009-12-25
  • 打赏
  • 举报
回复
这样效率不会高
Roc_Lee 2009-12-25
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 fredrickhu 的回复:]
那这样的话冗余是没办法避免了
还是用20楼的  查询好做点
[/Quote]


我的想法是最后有个表

1,【1,3】
这样就是 无糖 500ml 所有的数据其实通过这个。
别的表都算是参数表。最终的这个算是产品表吧
Roc_Lee 2009-12-25
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 dawugui 的回复:]
说了半天,还是你最初一楼设计就行了,只不过查询慢点.
[/Quote]

我感觉也是,不过是后台系统。单条数据的话应该还可以接受
dawugui 2009-12-25
  • 打赏
  • 举报
回复
说了半天,还是你最初一楼设计就行了,只不过查询慢点.
--小F-- 2009-12-25
  • 打赏
  • 举报
回复
那这样的话冗余是没办法避免了
还是用20楼的 查询好做点
Roc_Lee 2009-12-25
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 bancxc 的回复:]
只是查询比较费劲引用 13 楼 dawugui 的回复:
引用 12 楼 roc_lee 的回复:
引用 9 楼 bancxc 的回复:
这个表设计的太有问题了


给个表设计也行

主要是为了。有些属性可以组合的产品设计的。实在想不出更好的想法了

你这样设计表没问题,遇到多个名称时,采用11楼方法即可。

[/Quote]

是啊。其实有时间直接把数据库设计成所有属性段的就好了。但是有些浪费。也不方便扩展
设计成这样。随便加属性就好了。其实不受影响。
比如 原味500ml,原味1000ml这个就是2个产品了。其实对数据库量大的话也是有些影响的
Roc_Lee 2009-12-25
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 fredrickhu 的回复:]
那你把C表该成这样的也行

表C  产品属性对应表
id  B_id  value      B-ID2  value2
                                 
1    1        500ml    2        原味
2    1        1000ml  2      无糖

[/Quote]

f兄,其实这样可以。我之所以设计为1个字段就是因为 不止2个属性。这个属性可能没有,也可能是多属性的。算是抛砖引玉吧。
谢谢。
好久没写sql。手都生了。
过会完贴,再开个帖子你去接分。这点分不够。呵呵
Roc_Lee 2009-12-25
  • 打赏
  • 举报
回复
select t1.名称 ,t1.value,t2.value from
(select a.名称 , c.* from a, b,c where a.id = c.a_id and b.id = c.b_id) t1
,
(select a.名称 , c.* from a, b,c where a.id = c.a_id and b.id = c.b_id) t2
where t1.名称 = t2.名称 and t2.b_id<t1.b_id
这个可以达到结果。谢谢兄弟们

我准备再研究下多个属性的组合。
--小F-- 2009-12-25
  • 打赏
  • 举报
回复
那你把C表该成这样的也行

表C 产品属性对应表
id B_id value B-ID2 value2

1 1 500ml 2 原味
2 1 1000ml 2 无糖
bancxc 2009-12-25
  • 打赏
  • 举报
回复
只是查询比较费劲[Quote=引用 13 楼 dawugui 的回复:]
引用 12 楼 roc_lee 的回复:
引用 9 楼 bancxc 的回复:
这个表设计的太有问题了


给个表设计也行

主要是为了。有些属性可以组合的产品设计的。实在想不出更好的想法了

你这样设计表没问题,遇到多个名称时,采用11楼方法即可。
[/Quote]
Roc_Lee 2009-12-25
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 fredrickhu 的回复:]
把原糖 无味这样的属性的字段拿出来再建立一个表就行了
[/Quote]

当时也这么想了。但是你想如果有3,4个属性的话。岂不是多出了3,4张表。我就想通过技术来实现一下。然后表方面就一张,考下自己sql。从数据库设计方面的话也挺清楚的
--小F-- 2009-12-25
  • 打赏
  • 举报
回复
这个表设置一个关联ID 一个属性就行了
--小F-- 2009-12-25
  • 打赏
  • 举报
回复
把原糖 无味这样的属性的字段拿出来再建立一个表就行了
Roc_Lee 2009-12-25
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 dawugui 的回复:]
引用 12 楼 roc_lee 的回复:
引用 9 楼 bancxc 的回复:
这个表设计的太有问题了


给个表设计也行

主要是为了。有些属性可以组合的产品设计的。实在想不出更好的想法了

你这样设计表没问题,遇到多个名称时,采用11楼方法即可。
[/Quote]

老大,受教了。
Roc_Lee 2009-12-25
  • 打赏
  • 举报
回复
发现需求没给写清楚。解决问题过会继续补分。sorry

输出结果这样的就行
可口可乐 原味 500ml
可口可乐 原味 1000ml
可口可乐 无糖 500ml
可口可乐 无糖 1000ml

一般就是2个属性的组合。怕出现3个属性的。估计表设计的有问题。兄弟们有想法能提供一下也行

谢谢了
dawugui 2009-12-25
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 roc_lee 的回复:]
引用 9 楼 bancxc 的回复:
这个表设计的太有问题了


给个表设计也行

主要是为了。有些属性可以组合的产品设计的。实在想不出更好的想法了
[/Quote]
你这样设计表没问题,遇到多个名称时,采用11楼方法即可。
Roc_Lee 2009-12-25
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 bancxc 的回复:]
这个表设计的太有问题了
[/Quote]

给个表设计也行

主要是为了。有些属性可以组合的产品设计的。实在想不出更好的想法了
dawugui 2009-12-25
  • 打赏
  • 举报
回复
--保险起见,对原C表应该分类排序.
create table [A]([id] int,[名称] varchar(8))
insert [A]
select 1,'可口可乐'
create table [B]([id] int,[A_id] int,[A_Name] varchar(4))
insert [B]
select 1,1,'容量' union all
select 2,1,'口味'
create table [C]([id] int,[B_id] int,[value] varchar(6))
insert [C]
select 1,1,'500ml' union all
select 2,1,'1000ml' union all
select 3,2,'原味' union all
select 4,2,'无糖'
go

select 名称 ,
max(case px when 1 then value else '' end) value1,
max(case px when 2 then value else '' end) value2,
max(case px when 3 then value else '' end) value3,
max(case px when 4 then value else '' end) value4
from
(
select t1.* , px = (select count(1) from
(select a.名称 , c.* from a, b, c where a.id = b.a_id and b.id = c.b_id) t2
where t2.名称 = t1.名称 and t2.id < t1.id) + 1 from
(select a.名称 , c.* from a, b, c where a.id = b.a_id and b.id = c.b_id) t1
) m
group by 名称

drop table a , b , c

/*
名称 value1 value2 value3 value4
-------- ------ ------ ------ ------
可口可乐 500ml 1000ml 原味 无糖

(所影响的行数为 1 行)

*/
--小F-- 2009-12-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 roc_lee 的回复:]
改下需求

现在有表A  产品表
id    名称
1  可口可乐

表B  产品属性表
id  A_Name
1  容量
2  口味


表C  产品属性对应表
id  A_id B_id  value
1    1 1        500ml
2    1 1        1000ml
3    1 2        原味
4    1 2        无糖


怎么写查询语句可以查出如下结果

可口可乐    原味500ml    原味1000ml  无糖500ml  无糖1000ml
[/Quote]

4楼
加载更多回复(9)

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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