插件窝 干货文章 如何用单条 SQL 语句合并大量类似的重复查询?

如何用单条 SQL 语句合并大量类似的重复查询?

category SELECT 合并 使用 779    来源:    2025-03-31

合并大量类似重复查询的SQL优化方案

当需要执行大量结构相似但参数不同的查询时,可以使用以下几种SQL技术来合并这些查询,提高效率:

1. 使用IN子句合并查询

-- 原始多个查询:
-- SELECT * FROM users WHERE id = 1;
-- SELECT * FROM users WHERE id = 2;
-- SELECT * FROM users WHERE id = 3;

-- 合并为:
SELECT * FROM users WHERE id IN (1, 2, 3);

2. 使用CASE WHEN条件聚合

-- 统计不同状态的数量
SELECT 
    SUM(CASE WHEN status = 'active' THEN 1 ELSE 0 END) AS active_count,
    SUM(CASE WHEN status = 'pending' THEN 1 ELSE 0 END) AS pending_count,
    SUM(CASE WHEN status = 'inactive' THEN 1 ELSE 0 END) AS inactive_count
FROM users;

3. 使用UNION ALL合并结果

-- 合并多个查询结果
SELECT 'category1' AS category, COUNT(*) FROM products WHERE category = 'category1'
UNION ALL
SELECT 'category2' AS category, COUNT(*) FROM products WHERE category = 'category2'
UNION ALL
SELECT 'category3' AS category, COUNT(*) FROM products WHERE category = 'category3';

4. 使用临时表或CTE (Common Table Expression)

WITH params AS (
    SELECT 1 AS id UNION ALL
    SELECT 2 UNION ALL
    SELECT 3
)
SELECT u.* 
FROM users u
JOIN params p ON u.id = p.id;

5. 使用JSON或数组参数(某些数据库支持)

-- PostgreSQL示例
SELECT * FROM users WHERE id = ANY(ARRAY[1, 2, 3]);

-- MySQL 8.0+ JSON示例
SELECT * FROM users WHERE id MEMBER OF('[1, 2, 3]');

6. 使用PIVOT操作(某些数据库支持)

-- SQL Server PIVOT示例
SELECT *
FROM (
    SELECT category, product_id
    FROM products
) AS src
PIVOT (
    COUNT(product_id)
    FOR category IN ([category1], [category2], [category3])
) AS pvt;

最佳实践建议

  1. 根据数据库类型选择合适的方法
  2. 对于大量参数,考虑使用临时表或批量绑定
  3. 监控查询性能,确保合并后的查询确实更高效
  4. 注意IN子句的参数数量限制(不同数据库有不同限制)
  5. 对于非常复杂的合并,考虑使用存储过程

这些技术可以显著减少数据库往返次数,提高应用程序性能。