Pgsql 查询某个id下B表中的属性是否存在在A表字段现有属性中(设备)

20 篇文章 0 订阅

一.通过id查询B表所有设备去看A表是否有这些设备存在,返回已有最新存在的设备。(举一反三)

二.sql代码

--994140302  ?
SELECT ws.*,s.device FROM B ws LEFT JOIN A s ON ws.aton_id=s.aton_id
 WHERE ws.aton_id=994140302 AND CAST(ws.type AS varchar)=ANY(regexp_split_to_array(s.device, E','))

 

--查询某个id下的数据根据所选时间点的左右五分钟查询单条数据 (查出所属的)

SELECT
	es.station_name,
	MAX ( ec.bearing ) AS bearing,
	MAX ( ec.pitch_angle ) AS pitch_angle,
	MAX ( ec.roll_angle ) AS roll_angle
	FROM tableA es
	LEFT JOIN tableB ec ON ec.aton_id = es.aton_id 
	AND ec.acquisition_timestamp  BETWEEN to_timestamp( ?, 'yyyy-MM-dd hh24:mi:ss' ) + INTERVAL '-3 M' 
	AND to_timestamp( ?, 'yyyy-mm-dd hh24:mi:ss' ) + INTERVAL '+2 M' 
WHERE
	CAST ( es.aton_id AS VARCHAR ) = ANY ( regexp_split_to_array( ?, E',' ) ) 
GROUP BY
	es.station_name

三.Java实现 (jfanal)

 /**
     * 站点对比分页查询
     *
     * @param index Integer 页码
     * @param limit Integer 条数
     * @param ids   String 站点ID 多个 , 分隔
     * @param time  String 时间 yyyy-MM-dd hh24:mm:ss
     * @return Page<Record> 分页数据集合
     */
    public Page<Record> listStationComparedPage(Integer index, Integer limit, String ids, String time) {
        String select = "SELECT es.station_name,ec.*";
        String from = " FROM A es LEFT JOIN B ec ON ec.aton_id=es.aton_id AND ec.acquisition_timestamp " +
                " BETWEEN to_timestamp(?, 'yyyy-MM-dd hh24:mi:ss') + INTERVAL '-3 M' AND to_timestamp(?,'yyyy-mm-dd hh24:mi:ss') + INTERVAL '+2 M' " +
                " WHERE CAST(es.aton_id AS varchar) = ANY(regexp_split_to_array(?, E','))  ";
        Record paras = SqlUtil.assemblyParam(Timestamp.valueOf(time), Timestamp.valueOf(time), ids);
        return Db.use(Constant.ENAVMSI).paginate(index, limit, select, from, paras.getColumnValues());
    }

List  返回 

return dao.find(sql.toString(), atonId);

void 返回

return dao.findFirst(sql.toString(), atonId);
在PostgreSQL数据,如果你想查询某个schema(模式)每个的一条数据,你可以使用动态SQL来实现这一需求,因为PostgreSQL没有直接支持查询所有数据SQL语句。以下是一个简单的步骤说明,你可以通过编写一段SQL脚本来完成这个任务: 1. 首先,你需要查询出schema所有的名,这可以通过查询`information_schema.tables`视图来实现。 2. 然后,使用动态SQL构建查询每个表中一条数据SQL语句。 3. 最后,执行这些动态生成的SQL语句来获取每个数据。 下面是一个示例SQL脚本,用于实现上述步骤: ```sql -- 设置schema名称 SET search_path = myschema; -- 初始化一个变量用于动态SQL DO $$ BEGIN -- 清空临时 EXECUTE 'DROP TABLE IF EXISTS temp_result'; EXECUTE 'CREATE TEMP TABLE temp_result AS TABLE ' || quote_ident(T.table_schema) || '.' || quote_ident(T.table_name); -- 插入数据 EXECUTE 'INSERT INTO temp_result SELECT * FROM ' || quote_ident(T.table_schema) || '.' || quote_ident(T.table_name) || ' LIMIT 1' FROM information_schema.tables T WHERE T.table_schema = 'myschema' AND T.table_type = 'BASE TABLE' ORDER BY table_name; END; $$; -- 选择临时表中数据 SELECT * FROM temp_result; -- 清理临时 DROP TABLE temp_result; ``` 请注意,上述代码的`myschema`应该替换为你想要查询的schema名称。另外,由于动态SQL涉及到构建并执行SQL字符串,存在SQL注入的风险,因此在构建SQL字符串时应使用安全的方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liumce

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值