两个表相关联,求查询结果

威尔亨特 2008-03-20 10:11:37
表1
商品ID 商品名
1001 商品1001
1002 商品1002

表2
商品ID 商品列表ID 商品属性
1001 1 属性1001_1
1001 2 属性1001_2
1001 3 属性1001_3
1001 4 属性1001_4
1002 1 属性1002_1
1002 2 属性1002_2
1003 1 属性1003_1

表1和表2 INNER JOIN 关联。
表1的 商品ID 和表2的 商品属性都可以当检索条件。
商品ID 是 = 检索,商品属性 是 like 检索。
检索结果取 每个商品ID 的最小 商品列表ID。
比如没有where检索条件,那结果就是
------------------------------------------------------------------
1001 商品1001 1 属性1001_1
1002 商品1002 1 属性1002_1
-----------------------------------------------------------------------
如果检索条件是 where 表2.商品属性 like '%1002_2%' ,那么
结果就是
------------------------------------------------------------------
1002 商品1002 2 属性1002_2
-----------------------------------------------------------------------
如果检索条件是 where 表2.商品属性 like '%1002%' ,那么
结果就是
------------------------------------------------------------------
1002 商品1002 1 属性1002_1
-----------------------------------------------------------------------


SQL文怎么写?
...全文
92 5 打赏 收藏 举报
写回复
5 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
dawugui 2008-03-20
--这是使用存储过程的方法.
create table A(商品ID varchar(10), 商品名 varchar(10))
insert into A values('1001', '商品1001')
insert into A values('1002', '商品1002')
create table B(商品ID varchar(10) , 商品列表ID int, 商品属性 varchar(20))
insert into B values('1001', 1, '属性1001_1')
insert into B values('1001', 2, '属性1001_2')
insert into B values('1001', 3, '属性1001_3')
insert into B values('1001', 4, '属性1001_4')
insert into B values('1002', 1, '属性1002_1')
insert into B values('1002', 2, '属性1002_2')
insert into B values('1003', 1, '属性1003_1')
go

create procedure my_proc @商品属性 as varchar(20)
as
begin
if @商品属性 = '' or @商品属性 is null
select m.* from
(
select A.* , B.商品列表ID,B.商品属性 from A,B where A.商品ID = B.商品ID
) m where 商品列表ID = (select min(商品列表ID) from
(
select A.* , B.商品列表ID,B.商品属性 from A,B where A.商品ID = B.商品ID
) n where n.商品ID = m.商品ID
)
else
select m.* from
(
select A.* , B.商品列表ID,B.商品属性 from A,B where A.商品ID = B.商品ID and B.商品属性 like '%'+ @商品属性 + '%'
) m where 商品列表ID = (select min(商品列表ID) from
(
select A.* , B.商品列表ID,B.商品属性 from A,B where A.商品ID = B.商品ID and B.商品属性 like '%'+ @商品属性 + '%'
) n where n.商品ID = m.商品ID
)
end
go

exec my_proc ''
/*
商品ID 商品名 商品列表ID 商品属性
---------- ---------- ----------- --------------------
1001 商品1001 1 属性1001_1
1002 商品1002 1 属性1002_1

(所影响的行数为 2 行)
*/

exec my_proc '1002_2'
/*
商品ID 商品名 商品列表ID 商品属性
---------- ---------- ----------- --------------------
1002 商品1002 2 属性1002_2

(所影响的行数为 1 行)
*/

exec my_proc '1002'
/*
商品ID 商品名 商品列表ID 商品属性
---------- ---------- ----------- --------------------
1002 商品1002 1 属性1002_1

(所影响的行数为 1 行)
*/

drop table A,B
drop procedure my_proc
  • 打赏
  • 举报
回复
dawugui 2008-03-20
上面三条语句一样的,只是@商品属性的值不同.
  • 打赏
  • 举报
回复
dawugui 2008-03-20
--确保你B表的商品属性为"属性"开头.
create table A(商品ID varchar(10), 商品名 varchar(10))
insert into A values('1001', '商品1001')
insert into A values('1002', '商品1002')
create table B(商品ID varchar(10) , 商品列表ID int, 商品属性 varchar(20))
insert into B values('1001', 1, '属性1001_1')
insert into B values('1001', 2, '属性1001_2')
insert into B values('1001', 3, '属性1001_3')
insert into B values('1001', 4, '属性1001_4')
insert into B values('1002', 1, '属性1002_1')
insert into B values('1002', 2, '属性1002_2')
insert into B values('1003', 1, '属性1003_1')
go

declare @商品属性 as varchar(20)

set @商品属性 = ''
select m.* from
(
select A.* , B.商品列表ID,B.商品属性 from A,B where A.商品ID = B.商品ID and B.商品属性 like '%属性'+ @商品属性 + '%'
) m where 商品列表ID = (select min(商品列表ID) from
(
select A.* , B.商品列表ID,B.商品属性 from A,B where A.商品ID = B.商品ID and B.商品属性 like '%属性'+ @商品属性 + '%'
) n where n.商品ID = m.商品ID
)
/*
商品ID 商品名 商品列表ID 商品属性
---------- ---------- ----------- --------------------
1001 商品1001 1 属性1001_1
1002 商品1002 1 属性1002_1

(所影响的行数为 2 行)
*/

set @商品属性 = '1002_2'
select m.* from
(
select A.* , B.商品列表ID,B.商品属性 from A,B where A.商品ID = B.商品ID and B.商品属性 like '%属性'+ @商品属性 + '%'
) m where 商品列表ID = (select min(商品列表ID) from
(
select A.* , B.商品列表ID,B.商品属性 from A,B where A.商品ID = B.商品ID and B.商品属性 like '%属性'+ @商品属性 + '%'
) n where n.商品ID = m.商品ID
)
/*
商品ID 商品名 商品列表ID 商品属性
---------- ---------- ----------- --------------------
1002 商品1002 2 属性1002_2

(所影响的行数为 1 行)
*/

set @商品属性 = '1002'
select m.* from
(
select A.* , B.商品列表ID,B.商品属性 from A,B where A.商品ID = B.商品ID and B.商品属性 like '%属性'+ @商品属性 + '%'
) m where 商品列表ID = (select min(商品列表ID) from
(
select A.* , B.商品列表ID,B.商品属性 from A,B where A.商品ID = B.商品ID and B.商品属性 like '%属性'+ @商品属性 + '%'
) n where n.商品ID = m.商品ID
)
/*
商品ID 商品名 商品列表ID 商品属性
---------- ---------- ----------- --------------------
1002 商品1002 1 属性1002_1

(所影响的行数为 1 行)
*/

drop table A,B
  • 打赏
  • 举报
回复
青锋-SS 2008-03-20
select 商品ID,商品名,商品列表ID,商品属性
from tb1,tb2
where tb1.商品ID='检索条件' and 商品属性 like '检索条件'
and not exists(select 1 from tb2 t where tb2.商品ID=t.商品ID and t.商品ID列表>tb2.商品ID列表)
  • 打赏
  • 举报
回复
dawugui 2008-03-20
这个要用判断语句或存储过程写.
  • 打赏
  • 举报
回复
相关推荐
发帖
MS-SQL Server
加入

3.3w+

社区成员

MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
申请成为版主
帖子事件
创建了帖子
2008-03-20 10:11
社区公告
暂无公告