QAUP_Management/sql/fix_duplicate_rules.sql

128 lines
3.6 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- ================================================================
-- 修复重复规则的SQL脚本
-- 用于清理数据库中重复的空间规则定义
-- ================================================================
-- 1. 查找重复的规则(相同的规则名称)
SELECT
rule_name,
COUNT(*) as rule_count,
array_agg(rule_id ORDER BY rule_id) as rule_ids,
array_agg(spatial_object_id ORDER BY rule_id) as spatial_object_ids
FROM spatial_rules
GROUP BY rule_name
HAVING COUNT(*) > 1
ORDER BY rule_name;
-- 2. 查找具体的重复规则详情
WITH duplicate_rules AS (
SELECT rule_name, COUNT(*) as cnt
FROM spatial_rules
GROUP BY rule_name
HAVING COUNT(*) > 1
)
SELECT
sr.rule_id,
sr.rule_name,
sr.description,
sr.rule_category,
sr.status,
sr.priority,
sr.spatial_object_type,
sr.spatial_object_id,
sr.alert_level,
sr.rule_parameters,
sr.created_by,
sr.created_at
FROM spatial_rules sr
INNER JOIN duplicate_rules dr ON sr.rule_name = dr.rule_name
ORDER BY sr.rule_name, sr.created_at;
-- 3. 显示重复规则对应的车辆类型
WITH duplicate_rules AS (
SELECT rule_name, COUNT(*) as cnt
FROM spatial_rules
GROUP BY rule_name
HAVING COUNT(*) > 1
)
SELECT
sr.rule_id,
sr.rule_name,
sr.spatial_object_id,
array_agg(vt.vehicle_type ORDER BY vt.vehicle_type) as vehicle_types
FROM spatial_rules sr
INNER JOIN duplicate_rules dr ON sr.rule_name = dr.rule_name
LEFT JOIN spatial_rule_vehicle_types vt ON sr.rule_id = vt.rule_id
GROUP BY sr.rule_id, sr.rule_name, sr.spatial_object_id
ORDER BY sr.rule_name, sr.rule_id;
-- 4. 查找停机坪限速规则的重复情况
SELECT
rule_id,
rule_name,
spatial_object_id,
rule_parameters,
status,
created_at,
created_by
FROM spatial_rules
WHERE rule_name LIKE '%停机坪限速%' OR rule_name LIKE '%APRON%'
ORDER BY created_at;
-- 5. 删除重复的规则(保留最早创建的规则)
-- 注意在执行删除之前请确认要删除的规则ID
-- 5.1 删除重复规则的车辆类型关联(如果存在)
-- DELETE FROM spatial_rule_vehicle_types
-- WHERE rule_id IN (
-- SELECT rule_id
-- FROM spatial_rules
-- WHERE rule_name = '停机坪限速规则'
-- AND rule_id != (
-- SELECT rule_id
-- FROM spatial_rules
-- WHERE rule_name = '停机坪限速规则'
-- ORDER BY created_at ASC
-- LIMIT 1
-- )
-- );
-- 5.2 删除重复的规则记录(保留最早的)
-- DELETE FROM spatial_rules
-- WHERE rule_name = '停机坪限速规则'
-- AND rule_id != (
-- SELECT rule_id
-- FROM spatial_rules
-- WHERE rule_name = '停机坪限速规则'
-- ORDER BY created_at ASC
-- LIMIT 1
-- );
-- 6. 验证清理结果
-- SELECT
-- rule_name,
-- COUNT(*) as rule_count
-- FROM spatial_rules
-- GROUP BY rule_name
-- HAVING COUNT(*) > 1;
-- 7. 检查最终的规则状态
SELECT
r.rule_id,
r.rule_name,
r.rule_category,
r.spatial_object_id,
r.status,
r.priority,
r.rule_parameters,
array_agg(vt.vehicle_type ORDER BY vt.vehicle_type) as allowed_vehicle_types
FROM spatial_rules r
LEFT JOIN spatial_rule_vehicle_types vt ON r.rule_id = vt.rule_id
WHERE r.status = 'ACTIVE'
GROUP BY r.rule_id, r.rule_name, r.rule_category, r.spatial_object_id, r.status, r.priority, r.rule_parameters
ORDER BY r.rule_name;
-- 使用说明:
-- 1. 首先运行步骤1-4来查看重复规则的情况
-- 2. 确认需要删除的重复规则后取消注释步骤5中的DELETE语句并执行
-- 3. 运行步骤6-7验证清理结果