求SQL语句

fool4 2004-10-13 11:12:54
表结构:

pdt_no pdt_name attr_name the_value
---------------------------------------------------------
001 产品一 颜色 黑色
001 产品一 重量 50g
001 产品一 成分 羊毛
002 产品二 颜色 红色
002 产品二 重量 50g
……

每个产品的属性是不固定的,
现在希望用一个SQL语句找出满足条件的产品:

例如,颜色为黑色,重量为50g,成分为羊毛的产品?

注意,属性可以任意多个。
...全文
239 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
playyuer 2004-10-15
  • 打赏
  • 举报
回复
转化为 N 个 exists 条件, AND 在一起,才是正道!
playyuer 2004-10-15
  • 打赏
  • 举报
回复
转化为 N 个 exists , AND 条件,才是正道!
gnodiew 2004-10-15
  • 打赏
  • 举报
回复
SELECT pdt_no
FROM tabe
WHERE (attr_name = '颜色' AND the_value = '黑色') OR
(attr_name = '重量' AND the_value = '50g') OR
(attr_name = '成分' AND the_value = '羊毛')
GROUP BY pdt_no
HAVING (COUNT(pdt_no) = 3)
Selectau_fname 2004-10-14
  • 打赏
  • 举报
回复
有人!

up!
Selectau_fname 2004-10-14
  • 打赏
  • 举报
回复
用in查询的效率肯定不会高的!
fool4 2004-10-14
  • 打赏
  • 举报
回复
好像真的没人 :(
gnodiew 2004-10-14
  • 打赏
  • 举报
回复
SELECT pdt_no
FROM tabe
WHERE (attr_name = '颜色') AND (the_value = '黑色') OR
(attr_name = '重量') AND (the_value = '50g') OR
(attr_name = '成分') AND (the_value = '羊毛')
GROUP BY pdt_no
HAVING (COUNT(pdt_no) = 3)

playyuer 2004-10-14
  • 打赏
  • 举报
回复
这种动态属性 and 条件,应转化为下面 exists 条件:

select pdt_no,min(pdt_name)
from T a
where exists (select 1
from t
where pdt_no = a.pdt_no
and attr_name = '颜色'
and the_value = '黑色'
)
and exists (select 1
from t
where pdt_no = a.pdt_no
and attr_name = '重量'
and the_value = '50g'
)
and exists (select 1
from t
where pdt_no = a.pdt_no
and attr_name = '成分'
and the_value = '羊毛'
)
group by pdt_no
fool4 2004-10-14
  • 打赏
  • 举报
回复
没人吗?
777dragon 2004-10-14
  • 打赏
  • 举报
回复
up了
xjp6688 2004-10-14
  • 打赏
  • 举报
回复
只能是学习了!
zjcxc 元老 2004-10-14
  • 打赏
  • 举报
回复
--前面分析的时候,条件写错了,应该是这样才对

select a.*
from 视图 a,(
select pdt_no from 视图
where (attr_name='颜色' and the_value='黑色')
or(attr_name='重量' and the_value='50g')
or(attr_name='成分' and the_value='羊毛')
group by pdt_no
having count(distinct attr_name)=3
)b where a.pdt_no=b.pdt_no
zjcxc 元老 2004-10-14
  • 打赏
  • 举报
回复
--现在我们来构造一个比较通用的存储过程

--假设我们把属性名和属性值用两个字符串来传递
create proc p_qry
@attr_name varchar(4000)='', --用,分开的属性名列表
@the_value varchar(4000)='' --用,分开的属性值列表
as
set nocount on
declare @s varchar(8000),@i int,@j varchar(10)
if isnull(@attr_name,'')='' or isnull(@the_value,'')=''
--如果未指定条件,则直接查询
select * from 视图
else
begin
select @s='',@i=charindex(',',@attr_name+','),@j=0
while @i>1
select @s=@s+' or (attr_name='''+left(@attr_name,@i-1)+''''
,@attr_name=stuff(@attr_name,1,@i,'')
,@i=charindex(',',@the_value+',')
,@s=@s+' and the_value='''+left(@the_value,@i-1)+''')'
,@the_value=stuff(@the_value,1,@i,'')
,@i=charindex(',',@attr_name+',')
,@j=@j+1
set @s=stuff(@s,1,4,'')
exec('
select a.*
from 视图 a,(
select pdt_no from 视图 where '+@s+'
group by pdt_no
having count(distinct attr_name)='+@j+'
)b where a.pdt_no=b.pdt_no
')
end
go

--测试数据
create table 视图(pdt_no varchar(10),pdt_name varchar(10),attr_name varchar(10),the_value varchar(10))
insert 视图 select '001',' 产品一','颜色','黑色'
union all select '001',' 产品一','重量','50g'
union all select '001',' 产品一','成分','羊毛'
union all select '002',' 产品二','重量','50g'
union all select '002',' 产品二','成分','羊毛'
go

--调用存储过程
exec p_qry '颜色,重量,成分','黑色,50g,羊毛'
exec p_qry '重量,成分','50g,羊毛'
go

--删除测试
drop table 视图
drop proc p_qry

/*--测试结果

pdt_no pdt_name attr_name the_value
---------- ---------- ---------- ----------
001 产品一 颜色 黑色
001 产品一 重量 50g
001 产品一 成分 羊毛


pdt_no pdt_name attr_name the_value
---------- ---------- ---------- ----------
001 产品一 颜色 黑色
001 产品一 重量 50g
001 产品一 成分 羊毛
002 产品二 重量 50g
002 产品二 成分 羊毛
--*/
zjcxc 元老 2004-10-14
  • 打赏
  • 举报
回复
--查询的思路可以是这样的

--假设我们直接从视图中查询

--假设我们要查询的条件是:颜色为黑色 并且 重量为50g 并且 成分为羊毛 的产品

--我们可以构造如下的查询语句即可:

select a.*
from 视图 a,(
select 产品 from 视图
where attr_name='颜色' and the_value='黑色'
and attr_name='颜色' and the_value='黑色'
and attr_name='重量' and the_value='50g'
and attr_name='成分' and the_value='羊毛'
group by 产品
having count(distinct attr_name)=3
--因为我们查了三种属性,所以只有查询的结果中,该产品=3条的,才是符合查询条件的记录
)b where a.产品=b.产品


zjcxc 元老 2004-10-14
  • 打赏
  • 举报
回复
首先不考虑如果处理,首先要考虑的是,你传递的要查询的属性值个数是不固定的,那你怎么解决参数传递问题? SQL是不支持数组的.
fool4 2004-10-14
  • 打赏
  • 举报
回复
产品类别表: cls_no,cls_name
类别属性表: cls_no,attr_no,attr_name (一个类别有多个属性)
产品表: cls_no,pdt_no,pdt_name (一个类别有多个产品)
属性值表: cls_no,pdt_no,attr_no,the_value (每个产品的一个属性有一个属性值)

最后的视图就是你们看到的:
pdt_no pdt_name attr_name the_value
---------------------------------------------------------
001 产品一 颜色 黑色
001 产品一 重量 50g
001 产品一 成分 羊毛

最后想求按属性动态找产品的SQL语句,
例如,想要 颜色为黑色 并且 重量为50g 并且 成分为羊毛 的产品?

所以我的SQL里面就是按照这三个属性构建
(对于多个属性,只是增加或减少where中的条件即可),
但是那样效率不高,有没有别的解决方法?

zjcxc 元老 2004-10-14
  • 打赏
  • 举报
回复
建议说明问题根据自己实际的表结构设计,别带大家绕着走
zjcxc 元老 2004-10-14
  • 打赏
  • 举报
回复
按你自己的解决方案,表根本不是你列出的样式
fool4 2004-10-14
  • 打赏
  • 举报
回复
难道真的没有更好的办法吗??
fool4 2004-10-14
  • 打赏
  • 举报
回复
但是多个属性查找的时候怎么办?你那只是一个属性,我想要多个属性(数目不定)的SQL
加载更多回复(6)

34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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