如何编写SQL查询匹配(name, color)对集合的Person表数据?
匹配(name, color)对的SQL查询方案
核心思路
把需要匹配的(name, color)对构造为临时数据集,通过关联Person表和Color表,筛选出姓名匹配且拥有对应颜色的人员记录,最后去重避免重复返回。
通用SQL实现(支持VALUES子句的数据库:MySQL 8+/PostgreSQL/SQL Server等)
SELECT DISTINCT p.ID, p.Name FROM Person p JOIN Color c ON p.ID = c.PersonID JOIN ( -- 替换成你实际需要匹配的(name, color)列表 VALUES ('Alice', 'Red'), ('Bob', 'Green'), ('Cindy', 'Brown') ) AS matches(name, color) ON p.Name = matches.name AND c.Color = matches.color;
兼容老版本数据库的实现(比如MySQL 5.x)
如果数据库不支持VALUES子句,可以用UNION ALL构造临时数据集:
SELECT DISTINCT p.ID, p.Name FROM Person p JOIN Color c ON p.ID = c.PersonID JOIN ( SELECT 'Alice' AS name, 'Red' AS color UNION ALL SELECT 'Bob' AS name, 'Green' AS color UNION ALL SELECT 'Cindy' AS name, 'Brown' AS color ) AS matches ON p.Name = matches.name AND c.Color = matches.color;
效果说明
针对题目中的示例输入,上述查询会返回:
| ID | Name |
|---|---|
| 1 | Alice |
| 2 | Bob |
不存在的Cindy会被自动过滤,完全符合需求。
内容的提问来源于stack exchange,提问作者zzazzles
相关产品推荐
相关产品推荐

