有那么一个小的需求,我现在有一张产品表,那么业务部门需要让我们进行一个统计:
他告诉了我们“我们需要一张拥有我指定的同样配置的产品列表!”
话音刚落,苦逼的我们程序员就要开始执行任务啦!
其实业务场景很简单,写这个小文章只是为了让有同样需求的同学们少走弯路,特此记录了下来。
表结构:(我利用临时表)
IF EXISTS (SELECT 1 FROM tempdb..sysobjects WHERE name LIKE '%#ProductPropertyInfo%' and TYPE='U')
DROP TABLE #ProductInfo
IF EXISTS (SELECT 1 FROM tempdb..sysobjects WHERE name LIKE '%#ProductPropertyInfo%' and TYPE='U')
DROP TABLE #ProductPropertyInfo
CREATE TABLE #ProductInfo(
[产品ID] [int] NULL,
[产品名称] nvarchar(50) NULL,
[产品型号] nvarchar(50) NULL
)
CREATE TABLE #ProductPropertyInfo(
[产品ID] [int] NULL,
[属性配置] nvarchar(50) NULL
)
插入临时数据
INSERT INTO #ProductInfo([产品ID],[产品名称],[产品型号])VALUES(1,'长城汽车','C50');
INSERT INTO #ProductInfo([产品ID],[产品名称],[产品型号])VALUES(2,'长城汽车','C30');
INSERT INTO #ProductInfo([产品ID],[产品名称],[产品型号])VALUES(3,'长城汽车','H5');
INSERT INTO #ProductInfo([产品ID],[产品名称],[产品型号])VALUES(4,'长城汽车','H6');
INSERT INTO #ProductInfo([产品ID],[产品名称],[产品型号])VALUES(5,'奥迪汽车','A4');
INSERT INTO #ProductInfo([产品ID],[产品名称],[产品型号])VALUES(6,'奥迪汽车','A6');
INSERT INTO #ProductInfo([产品ID],[产品名称],[产品型号])VALUES(7,'奥迪汽车','A8');
INSERT INTO #ProductInfo([产品ID],[产品名称],[产品型号])VALUES(8,'奥迪汽车','A3');
INSERT INTO #ProductPropertyInfo([产品ID],[属性配置])VALUES(1,'天窗');
INSERT INTO #ProductPropertyInfo([产品ID],[属性配置])VALUES(1,'电加热座椅');
INSERT INTO #ProductPropertyInfo([产品ID],[属性配置])VALUES(1,'涡轮增压');
INSERT INTO #ProductPropertyInfo([产品ID],[属性配置])VALUES(2,'天窗');
INSERT INTO #ProductPropertyInfo([产品ID],[属性配置])VALUES(3,'涡轮增压');
INSERT INTO #ProductPropertyInfo([产品ID],[属性配置])VALUES(3,'电加热座椅');
INSERT INTO #ProductPropertyInfo([产品ID],[属性配置])VALUES(3,'天窗');
INSERT INTO #ProductPropertyInfo([产品ID],[属性配置])VALUES(4,'涡轮增压');
INSERT INTO #ProductPropertyInfo([产品ID],[属性配置])VALUES(4,'精英轮毂');
INSERT INTO #ProductPropertyInfo([产品ID],[属性配置])VALUES(4,'电加热座椅');
INSERT INTO #ProductPropertyInfo([产品ID],[属性配置])VALUES(4,'天窗');
INSERT INTO #ProductPropertyInfo([产品ID],[属性配置])VALUES(4,'GPS');
INSERT INTO #ProductPropertyInfo([产品ID],[属性配置])VALUES(8,'天窗');
INSERT INTO #ProductPropertyInfo([产品ID],[属性配置])VALUES(8,'涡轮增压');
INSERT INTO #ProductPropertyInfo([产品ID],[属性配置])VALUES(8,'电加热座椅');
INSERT INTO #ProductPropertyInfo([产品ID],[属性配置])VALUES(5,'自动泊车');
INSERT INTO #ProductPropertyInfo([产品ID],[属性配置])VALUES(5,'电加热座椅');
INSERT INTO #ProductPropertyInfo([产品ID],[属性配置])VALUES(5,'天窗');
INSERT INTO #ProductPropertyInfo([产品ID],[属性配置])VALUES(5,'涡轮增压');
INSERT INTO #ProductPropertyInfo([产品ID],[属性配置])VALUES(6,'自动泊车');
INSERT INTO #ProductPropertyInfo([产品ID],[属性配置])VALUES(6,'电加热座椅');
INSERT INTO #ProductPropertyInfo([产品ID],[属性配置])VALUES(6,'天窗');
INSERT INTO #ProductPropertyInfo([产品ID],[属性配置])VALUES(6,'涡轮增压');
INSERT INTO #ProductPropertyInfo([产品ID],[属性配置])VALUES(6,'精英轮毂');
INSERT INTO #ProductPropertyInfo([产品ID],[属性配置])VALUES(6,'GPS');
INSERT INTO #ProductPropertyInfo([产品ID],[属性配置])VALUES(7,'自动泊车');
INSERT INTO #ProductPropertyInfo([产品ID],[属性配置])VALUES(7,'电加热座椅');
INSERT INTO #ProductPropertyInfo([产品ID],[属性配置])VALUES(7,'天窗');
INSERT INTO #ProductPropertyInfo([产品ID],[属性配置])VALUES(7,'涡轮增压');
INSERT INTO #ProductPropertyInfo([产品ID],[属性配置])VALUES(7,'精英轮毂');
INSERT INTO #ProductPropertyInfo([产品ID],[属性配置])VALUES(7,'防弹玻璃');
INSERT INTO #ProductPropertyInfo([产品ID],[属性配置])VALUES(7,'GPS');
查看数据效果:
从模拟数据上可以直观的看到我们所要查询的数据,我们要根据配置来选车,根据我们想要的功能来查看有那款车子符合我的需求:
语句:(假设我目前需要拥有:“精英轮毂”和“GPS”功能特性的车子)
SELECT * FROM #ProductInfo p INNER JOIN (
SELECT
[产品ID]
FROM #ProductPropertyInfo WHERE [属性配置] IN ('精英轮毂','GPS')
GROUP BY [产品ID] HAVING(COUNT(DISTINCT [属性配置]) > 1)) y ON p.[产品ID] = y.[产品ID]
查询特性的语句完全取决于:[属性配置] IN ('精英轮毂','GPS') 想要什么配置就有什么配置啦!
本文章只作为基础SQL语句的功能实现部分,如果有更好的方式也可以一起交流。