如何编写SQL条件查询:按店铺颜色XXL存在性返回对应数据
SQL 查询:按店铺+颜色筛选夹克尺码(优先返回XXL)
需求说明
给定一张服装信息表(假设表名为jackets),包含ID、Shop、Jacket_Size、Jacket_Color字段,需要实现以下逻辑:
- 对于同一
Shop+Jacket_Color组合,若存在XXL尺码的夹克,仅返回该组合下的XXL尺码记录 - 若该组合无XXL尺码,则返回该组合下的所有尺码记录
解决方案
方法一:使用窗口函数(推荐,性能更优)
利用窗口函数统计每个店铺+颜色组合中XXL尺码的数量,再根据统计结果筛选记录:
SELECT ID, Shop, Jacket_Size, Jacket_Color FROM ( SELECT *, -- 按Shop和Color分组,统计每组中XXL的数量 COUNT(CASE WHEN Jacket_Size = 'XXL' THEN 1 END) OVER (PARTITION BY Shop, Jacket_Color) AS has_xxl FROM jackets ) AS sub_query -- 筛选逻辑:有XXL则只留XXL记录,无XXL则留所有记录 WHERE (has_xxl > 0 AND Jacket_Size = 'XXL') OR has_xxl = 0;
方法二:使用关联子查询
先提取所有存在XXL尺码的店铺+颜色组合,再通过左连接筛选符合条件的记录:
SELECT j.ID, j.Shop, j.Jacket_Size, j.Jacket_Color FROM jackets j LEFT JOIN ( -- 找出所有包含XXL尺码的Shop+Color组合 SELECT DISTINCT Shop, Jacket_Color FROM jackets WHERE Jacket_Size = 'XXL' ) AS xxl_combinations ON j.Shop = xxl_combinations.Shop AND j.Jacket_Color = xxl_combinations.Jacket_Color -- 筛选逻辑:属于XXL组合则只留XXL记录,不属于则留所有记录 WHERE (xxl_combinations.Shop IS NOT NULL AND j.Jacket_Size = 'XXL') OR xxl_combinations.Shop IS NULL;
示例验证
原表数据
| ID | Shop | Jacket_Size | Jacket_Color |
|---|---|---|---|
| 1 | Shop A | M | Black |
| 2 | Shop A | XXL | Black |
| 3 | Shop A | L | Blue |
| 4 | Shop B | XL | Red |
| 5 | Shop B | XXL | Red |
| 6 | Shop B | S | Green |
| 7 | Shop C | M | Yellow |
| 8 | Shop C | L | Yellow |
期望查询结果
| ID | Shop | Jacket_Size | Jacket_Color |
|---|---|---|---|
| 2 | Shop A | XXL | Black |
| 3 | Shop A | L | Blue |
| 5 | Shop B | XXL | Red |
| 6 | Shop B | S | Green |
| 7 | Shop C | M | Yellow |
| 8 | Shop C | L | Yellow |
内容的提问来源于stack exchange,提问作者Atlasz
相关产品推荐
相关产品推荐

