请教一个关于关联表查询的sql

liu_lxx 2017-06-23 12:00:35
product表:id,name
attribute表:productId,attributeKey,value

怎么查询同时满足key="key1",value="value1";key="key2",value="value2"的商品id?
...全文
84 点赞 收藏 7
写回复
7 条回复
liu_lxx 2017年06月23日
谢谢回复。 我的key1和key2数量不是固定的,这种方式就不适用了吧。
引用 1 楼 sinat_28984567 的回复:
--测试数据
if not object_id(N'Tempdb..#product') is null
	drop table #product
Go
Create table #product([id] int,[name] nvarchar(23))
Insert #product
select 1,N'产品1' union all
select 2,N'产品2'
GO
if not object_id(N'Tempdb..#attribute') is null
	drop table #attribute
Go
Create table #attribute([productId] int,[attributeKey] nvarchar(24),[value] nvarchar(26))
Insert #attribute
select 1,N'key1',N'value1' union all
select 1,N'key2',N'value2' union all
select 2,N'key1',N'value1'
Go
--测试数据结束
SELECT  #product.*
FROM    #attribute a
        JOIN #attribute b ON b.productId = a.productId
        JOIN #product ON a.productId = id
WHERE   a.attributeKey = 'key1'
        AND a.value = 'value1'
        AND b.attributeKey = 'key2'
        AND b.value = 'value2'
谢谢回复。 我的key1和key2数量不是固定的,这种方式就不适用了吧。
回复 点赞
二月十六 2017年06月23日
--测试数据
if not object_id(N'Tempdb..#product') is null
drop table #product
Go
Create table #product([id] int,[name] nvarchar(23))
Insert #product
select 1,N'产品1' union all
select 2,N'产品2'
GO
if not object_id(N'Tempdb..#attribute') is null
drop table #attribute
Go
Create table #attribute([productId] int,[attributeKey] nvarchar(24),[value] nvarchar(26))
Insert #attribute
select 1,N'key1',N'value1' union all
select 1,N'key2',N'value2' union all
select 2,N'key1',N'value1'
Go
--测试数据结束
SELECT #product.*
FROM #attribute a
JOIN #attribute b ON b.productId = a.productId
JOIN #product ON a.productId = id
WHERE a.attributeKey = 'key1'
AND a.value = 'value1'
AND b.attributeKey = 'key2'
AND b.value = 'value2'


回复 点赞
liu_lxx 2017年06月23日
引用 6 楼 sinat_28984567 的回复:
有用,谢谢了
回复 点赞
二月十六 2017年06月23日
--测试数据
if not object_id(N'Tempdb..#product') is null
drop table #product
Go
Create table #product([id] int,[name] nvarchar(23))
Insert #product
select 1,N'产品1' union all
select 2,N'产品2'
GO
if not object_id(N'Tempdb..#attribute') is null
drop table #attribute
Go
Create table #attribute([productId] int,[attributeKey] nvarchar(24),[value] nvarchar(26))
Insert #attribute
select 1,N'key1',N'value1' union all
select 1,N'key2',N'value2' union all
select 2,N'key1',N'value1'
Go
--测试数据结束
SELECT #product.*
FROM #product
WHERE EXISTS ( SELECT *
FROM #attribute
WHERE attributeKey = 'key1'
AND value = 'value1'
AND productId = id )
AND EXISTS ( SELECT *
FROM #attribute
WHERE attributeKey = 'key2'
AND value = 'value2'
AND productId = id )



回复 点赞
liu_lxx 2017年06月23日
引用 3 楼 sinat_28984567 的回复:
key和value是怎么传到数据库的?是一个字符串吗?用分号分隔的?还是怎样的?
只是想尽量使用一次数据查询搞定
回复 点赞
liu_lxx 2017年06月23日
引用 3 楼 sinat_28984567 的回复:
key和value是怎么传到数据库的?是一个字符串吗?用分号分隔的?还是怎样的?
我在程序里面组织的sql语句,并没有传到数据库。
回复 点赞
二月十六 2017年06月23日
引用 2 楼 qq381334617 的回复:
谢谢回复。 我的key1和key2数量不是固定的,这种方式就不适用了吧。
key和value是怎么传到数据库的?是一个字符串吗?用分号分隔的?还是怎样的?
回复 点赞
发动态
发帖子
应用实例
创建于2007-09-28

1.1w+

社区成员

6.8w+

社区内容

MS-SQL Server 应用实例
社区公告
暂无公告