JQuick-SQL JOIN 查询:连接注册数据集的正确方式

JQuick-SQL JOIN 查询:连接注册数据集的正确方式

Meta 描述:说明 jquick-sql 的 INNER、LEFT、RIGHT、CROSS、NATURAL JOIN 用法、别名匹配要求及可执行 Java 示例,避免把注册数据集误解为 JDBC 表连接。

标签:jquick-sql、SQL JOIN、LEFT JOIN、INNER JOIN、Java 分布式 SQL 查询引擎、异构数据源联邦查询、表别名

官网示例:

前言

JOIN 用于把多个已注册数据集按关系组合。jquick-sql 支持 INNER JOIN、LEFT JOIN、RIGHT JOIN、CROSS JOIN 与 NATURAL JOIN。它不自行建立远程数据库连接:Java 跨库查询或异构数据源联邦查询中的数据,应先由应用或上游组件接入并注册。

连接类型与选择原则

INNER JOIN 只保留匹配行;LEFT JOIN 保留左表全部行;RIGHT JOIN 保留右表全部行。CROSS JOIN 产生笛卡尔组合,必须谨慎控制数据量;NATURAL JOIN 依赖同名列,字段演进较频繁时更推荐明确 ON 条件。

sql 复制代码
SELECT u.name, o.amount
FROM users u
LEFT JOIN orders o ON u.id = o.user_id

项目当前能力范围不包含 FULL OUTER JOIN,设计查询时应以受支持的连接类型拆分业务逻辑。

别名与列元数据保持一致

JQuickColumnMeta 的第三个参数保存表名/表别名。测试使用 users u、orders o,并以 u.id、o.user_id 引用列:

sql 复制代码
SELECT u.id, u.name, o.id AS order_id, o.amount
FROM users u INNER JOIN orders o ON u.id = o.user_id
WHERE u.status = 'active' AND o.amount >= 150

为避免列解析失败,注册表名、元数据限定信息和 SQL 引用应遵循项目既有别名规则。

可执行 Java 案例

java 复制代码
import com.github.paohaijiao.engine.JQuickSQL;
import com.github.paohaijiao.statement.JQuickColumnMeta;
import com.github.paohaijiao.statement.JQuickDataSet;
import com.github.paohaijiao.statement.JQuickRow;
import java.util.Arrays;
import java.util.List;

public class JoinQueryDemo {
    public static void main(String[] args) {
        JQuickSQL sql = JQuickSQL.embedded();
        try {
            sql.registerTable("users", Arrays.asList(
                new JQuickColumnMeta("id", Integer.class, "users"),
                new JQuickColumnMeta("name", String.class, "users")
            ), Arrays.asList(row("id", 1, "name", "Alice"), row("id", 2, "name", "Bob")));
            sql.registerTable("orders", Arrays.asList(
                new JQuickColumnMeta("id", Integer.class, "orders"),
                new JQuickColumnMeta("user_id", Integer.class, "orders"),
                new JQuickColumnMeta("amount", Double.class, "orders")
            ), Arrays.asList(row("id", 101, "user_id", 1, "amount", 200.0)));
            JQuickDataSet result = sql.execute(
                "SELECT u.name, o.id AS order_id, o.amount FROM users u LEFT JOIN orders o ON u.id = o.user_id"
            );
            result.printTable();
        } finally {
            sql.shutdown();
        }
    }
    private static JQuickRow row(Object... kv) {
        JQuickRow r = new JQuickRow();
        for (int i = 0; i < kv.length; i += 2) r.put((String) kv[i], kv[i + 1]);
        return r;
    }
}

常见问题

**何时使用 LEFT JOIN?**需要保留主数据,即使关联表没有匹配记录时。

**可否省略列前缀?**多表字段可能重名,建议始终写 u.id 这类限定名。

**JOIN 是否自动连接两个数据库?**不会;先接入并注册数据集,再由 SQL 做逻辑连接。

总结与拓展

JOIN 是轻量级 SQL 引擎构建统一业务视图的核心。把上游数据标准化为具有明确类型与别名的注册表后,可在同一嵌入式执行环境中完成安全、可读的多表关联。

Core Advantage

Supported joins combine application-owned datasets through familiar SQL semantics.

Applicable Scenarios

User-order views, normalized connector outputs, local reporting, and service-side data composition.

相关推荐
Zan8 小时前
SQLite + SQLx 实战:为什么已经发布的数据库迁移文件,绝对不能再修改?
数据库·后端·面试
这个DBA有点耶9 小时前
数据同步的三个工程底线:DDL同步、断点续传、一致性校验——开源CDC的边界与KFS的路径
数据库·dba·代码规范
SelectDB10 小时前
列式存储为什么适合分析类负载?原理、限制与日志场景应用
数据库
数据库小学妹10 小时前
MySQL大字段治理:行溢出机制、覆盖索引与拆表
数据库·mysql·性能优化
爱吃奥利奥_wen11 小时前
SQL Server 基础语法详解:从建库建表到约束与增删改查
服务器·数据库·oracle
这个DBA有点耶12 小时前
MySQL 8.0不可见索引:删索引怕出事,不删又拖慢写入——中间态怎么用?
数据库·mysql·代码规范
测试界的小码农13 小时前
【图数据库实战进阶(01):从零认识 Neo4j,搭建第一个图数据库项目】
数据库·neo4j
x_SpiderMan13 小时前
搭建Oracle RAC 集群
数据库·oracle
测试界的小码农13 小时前
【图数据库实战进阶(03):Neo4j 图数据建模实战——节点、关系与属性应该怎么设计?】
数据库·oracle·neo4j