简单查询,怎么做效率比较高

czyoooo 2009-10-30 10:34:22
代码表
A001 西瓜
A002 南瓜
A003 东瓜


产品表
1 A001 A002 A003
2 A002 A003


查询结果
1 西瓜 南瓜 冬瓜
2 南瓜 东瓜

...全文
134 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
ccc_moriya 2009-11-06
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 urdoom 的回复:]
如果产品表是一个字段放n个产品,那么肯定查询效率低下,还要涉及字符串分割或者包含等等
如果产品表是一个字段放一个产品,那么你怎么知道最多要放几个产品来定义表?就算知道最多有几个字段
你怎么知道其中那些字段要取出来?
这些都是超级影响系统效率的地方
[/Quote]
那就這個例子,請問怎麼改呢?
人鱼传说 2009-11-02
  • 打赏
  • 举报
回复
不建议楼主将产品代码集放在一个字段里
wangao20463165 2009-10-31
  • 打赏
  • 举报
回复
我没用连接,不知道这么做算满足需求吧?
--> 测试数据:[代码表]
if object_id('[代码表]') is not null drop table [代码表]
go
create table [代码表]([col1] varchar(4),[col2] varchar(4))
insert [代码表]
select 'A001','西瓜' union all
select 'A002','南瓜' union all
select 'A003','东瓜'
--> 测试数据:[产品表]
if object_id('[产品表]') is not null drop table [产品表]
go
create table [产品表]([id] int,[col1] varchar(4),[col2] varchar(4),[col3] varchar(4))
insert [产品表]
select 1,'A001','A002','A003' union all
select 2,'A002','A003',null

select * from 产品表
select id,col1= case col1 when 'A001' then '西瓜'
when 'A002' then '南瓜'
when 'A003' then '冬瓜'
else col1
end,col2=case col2 when 'A001' then '西瓜'
when 'A002' then '南瓜'
when 'A003' then '冬瓜'
else col2
end,col3=case col3 when 'A001' then '西瓜'
when 'A002' then '南瓜'
when 'A003' then '冬瓜'
else col3
end
from 产品表
结果:
id col1 col2 col3
1 西瓜 南瓜 冬瓜
2 南瓜 冬瓜 NULL
--小F-- 2009-10-30
  • 打赏
  • 举报
回复
----------------------------------------------------------------
-- Author :fredrickhu(我是小F,向高手学习)
-- Date :2009-10-30 10:35:45
-- Version:
-- Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86)
-- Nov 24 2008 13:01:59
-- Copyright (c) 1988-2005 Microsoft Corporation
-- Developer Edition on Windows NT 5.2 (Build 3790: Service Pack 1)
--
----------------------------------------------------------------
--> 测试数据:[代码表]
if object_id('[代码表]') is not null drop table [代码表]
go
create table [代码表]([col1] varchar(4),[col2] varchar(4))
insert [代码表]
select 'A001','西瓜' union all
select 'A002','南瓜' union all
select 'A003','东瓜'
--> 测试数据:[产品表]
if object_id('[产品表]') is not null drop table [产品表]
go
create table [产品表]([id] int,[col1] varchar(4),[col2] varchar(4),[col3] varchar(4))
insert [产品表]
select 1,'A001','A002','A003' union all
select 2,'A002','A003',null
--------------开始查询--------------------------
select
a.id,b.col2 as 产品1,c.col2 as 产品2,isnull(d.col2,'') as 产品3
from
产品表 a
left join 代码表 b
on
a.col1 = b.col1
left join 代码表 c
on
a.col2 = c.col1
left join 代码表 d
on
a.col3 = d.col1
----------------结果----------------------------
/* id 产品1 产品2 产品3
----------- ---- ---- ----
1 西瓜 南瓜 东瓜
2 南瓜 东瓜

(2 行受影响)
*/
sdhdy 2009-10-30
  • 打赏
  • 举报
回复
两个表的连接,LEFT JOIN轻松搞定!
华夏小卒 2009-10-30
  • 打赏
  • 举报
回复
如果A001 A002 A003 是一个字段的话,就不好搞了
--小F-- 2009-10-30
  • 打赏
  • 举报
回复
----------------------------------------------------------------
-- Author :fredrickhu(我是小F,向高手学习)
-- Date :2009-10-30 10:35:45
-- Version:
-- Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86)
-- Nov 24 2008 13:01:59
-- Copyright (c) 1988-2005 Microsoft Corporation
-- Developer Edition on Windows NT 5.2 (Build 3790: Service Pack 1)
--
----------------------------------------------------------------
--> 测试数据:[代码表]
if object_id('[代码表]') is not null drop table [代码表]
go
create table [代码表]([col1] varchar(4),[col2] varchar(4))
insert [代码表]
select 'A001','西瓜' union all
select 'A002','南瓜' union all
select 'A003','东瓜'
--> 测试数据:[产品表]
if object_id('[产品表]') is not null drop table [产品表]
go
create table [产品表]([id] int,[col1] varchar(4),[col2] varchar(4),[col3] varchar(4))
insert [产品表]
select 1,'A001','A002','A003' union all
select 2,'A002','A003',null
--------------开始查询--------------------------
select
a.id,b.col2 as 产品1,c.col2 as 产品2,d.col2 as 产品3
from
产品表 a
left join 代码表 b
on
a.col1 = b.col1
left join 代码表 c
on
a.col2 = c.col1
left join 代码表 d
on
a.col3 = d.col1
----------------结果----------------------------
/* id 产品1 产品2 产品3
----------- ---- ---- ----
1 西瓜 南瓜 东瓜
2 南瓜 东瓜 NULL

(2 行受影响)
*/
SQL77 2009-10-30
  • 打赏
  • 举报
回复
SELECT 
A.ID,
B.名字,
C.名字,
D.名字
FROM
产品表 A LEFT JOIN 代码表 B
ON A.NAME=B.NAME LEFT JOIN
代码表 C ON A.NAME=C.NAME LEFT JOIN
代码表 D ON A.NAME =D.NAME
SQL77 2009-10-30
  • 打赏
  • 举报
回复
字段名字都没有,不过用LEFT JOIN 要好
SQL77 2009-10-30
  • 打赏
  • 举报
回复
SELECT A.ID,B.名字,C.名字,D.名字 FROM 产品表 A,代码表 B,代码表 C,代码表 D WHER A.NAME=B.NAME AND A.NAME=C.NAME AND A.NAME =D.NAME
liangCK 2009-10-30
  • 打赏
  • 举报
回复
select a.id,b.名称 as 产品1,c.名称 as 产品2,d.名称 as 产品3
from 产品表 as a
left join 代码表 as b
on a.产品1 = b.代码
left join 代码表 as c
on a.产品2 = c.代码
left join 代码表 as d
on a.产品3 = d.代码
xiequan2 2009-10-30
  • 打赏
  • 举报
回复
高手太多了,友情帮顶
smry 2009-10-30
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 urdoom 的回复:]
如果产品表是一个字段放n个产品,那么肯定查询效率低下,还要涉及字符串分割或者包含等等
如果产品表是一个字段放一个产品,那么你怎么知道最多要放几个产品来定义表?就算知道最多有几个字段
你怎么知道其中那些字段要取出来?
这些都是超级影响系统效率的地方
[/Quote]

我看这里的产品表像是组合产品。例:一个产品组合由:西瓜+南瓜+冬瓜
pbsh 2009-10-30
  • 打赏
  • 举报
回复
楼上达人多,友情帮顶了。
urdoom 2009-10-30
  • 打赏
  • 举报
回复
如果产品表是一个字段放n个产品,那么肯定查询效率低下,还要涉及字符串分割或者包含等等
如果产品表是一个字段放一个产品,那么你怎么知道最多要放几个产品来定义表?就算知道最多有几个字段
你怎么知道其中那些字段要取出来?
这些都是超级影响系统效率的地方
urdoom 2009-10-30
  • 打赏
  • 举报
回复
产品表的设计有问题,现在不改以后有你痛苦的
软件工程说了,上流的错误影响最大

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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