128 lines
3.6 KiB
SQL
128 lines
3.6 KiB
SQL
-- ================================================================
|
||
-- 修复重复规则的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验证清理结果 |