PGSQL

创建序列

create sequence if not exists inf_topology_node_device_id_seq increment by 1 minvalue 1 no maxvalue start with 1;

nextval('inf_topology_node_device_id_seq'::regclass)

//查询序列
SELECT c.relname FROM pg_class c WHERE c.relkind ='S';

函数

CREATE OR REPLACE FUNCTION merge_db(key1 varchar, key2 varchar, data varchar) RETURNS INT AS
$$
BEGIN
    LOOP
				IF (syncstatus is null or syncstatus = '') THEN
						syncstatus='0';
				END IF;
        UPDATE info_topology_node_device 
				SET device_id = deviceid, 
					device_name = devicename,
					group_id=groupid,
					group_name=groupname,
					syn_status=syncstatus 
				WHERE apm_id = apmid and template_component_id = templatecomponentid;
        IF found THEN
            RETURN 1;
        END IF;
        INSERT INTO info_topology_node_device 
				(apm_id,template_component_id,template_component_name,device_id,device_name,group_id,group_name) 
				VALUES (apmid , templatecomponentid ,templatecomponentname , deviceid ,devicename ,groupid ,groupname ) ;
				IF found THEN
            RETURN 1;
        END IF;
    END LOOP;
END;
$$
LANGUAGE plpgsql;

插入更新

--多字段联合约束
INSERT INTO info_topology_node_device (apm_id,template_component_id,template_component_name,device_id,device_name,group_id,group_name) 
     VALUES ('2','2','1','1','1','1','1')
ON CONFLICT ON CONSTRAINT simple_unique DO  UPDATE SET 
device_id = '2', device_name = '2';

树形结构的查询

with recursive cte as (
-- 先查询root节点
select id,name,alias,group_id,parent_id,template_id,apm_id,status,sync_status,srp_version FROM info_topology_node where id = '0'
union all
-- 通过cte递归查询root节点的直接子节点
select origin.id, origin.name,origin.alias,origin.group_id, cte.id as parent_id,origin.template_id,origin.apm_id,origin.status,origin.sync_status,origin.srp_version
from cte join info_topology_node as origin on origin.parent_id = cte.id )
select id,name,alias,group_id,parent_id,template_id,apm_id,status,srp_version  from cte

统计

--节点的设备绑定信息 s1未绑定设备, s2绑定设备
select * from info_topology topology LEFT JOIN(
	select group_id,sum(case when d_apm_id is null then 0 else 1 end)  s1,sum(case when d_apm_id is not null then 0 else 1 end) s2 
	from (
		select distinct node.group_id,node.id,node.apm_id,device.apm_id d_apm_id from info_topology_node node  LEFT JOIN info_topology_node_device device on node.apm_id=device.apm_id
	) a group by group_id
) aaaa on topology.id=aaaa.group_id

posted @ 2021-07-02 08:27  地球小星星  阅读(133)  评论(0)    收藏  举报