有那么一個小的需求,我現在有一張產品表,那么業務部門需要讓我們進行一個統計:
他告訴了我們“我們需要一張擁有我指定的同樣配置的產品列表!”
話音剛落,苦逼的我們程序員就要開始執行任務啦!
其實業務場景很簡單,寫這個小文章只是為了讓有同樣需求的同學們少走彎路,特此記錄了下來。
表結構:(我利用臨時表)
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語句的功能實現部分,如果有更好的方式也可以一起交流。