MySQL单表查询两次关联第二张表匹配字段值的SQL实现方法
双关联匹配机器描述的SQL实现
核心逻辑是对MachineTable做两次带独立别名的关联,分别匹配创建、完结两个环节的机器编号,即可同时拿到两个场景下的机器描述。
修正后的完整SQL
首先注意你原有查询的语法问题:字段CreatedDate额外加了单引号,会被数据库识别为字符串常量而非字段名,会导致条件判断失效。
SELECT t.CreatedId, m1.machineDescription AS CreatedDesc, t.Value, t.CreatedDate, t.CompletedId, m2.machineDescription AS CompletedDesc, t.CompletedDate, t.Status FROM TransactionsTable t -- 关联创建机器信息 LEFT JOIN MachineTable m1 ON t.CreatedId = m1.machineNumber -- 关联完结机器信息 LEFT JOIN MachineTable m2 ON t.CompletedId = m2.machineNumber WHERE t.Status = 'COMPLETE' AND t.CreatedDate BETWEEN '2022-01-01' AND '2022-01-31';
关键注意点
- 同一张表多次关联时必须设置不同别名(示例中用
m1、m2区分两次关联的机器表),否则会触发表名歧义的语法错误 - 选用
LEFT JOIN而非INNER JOIN:如果后续需要查询ACTIVE状态的未完结记录(CompletedId为NULL),左连接不会过滤这类记录,对应CompletedDesc会返回NULL,符合业务查询的通用需求 - 多表关联场景下建议所有字段加表别名前缀,避免同名字段引发的查询错误
- SQL中日期、字符串常量统一用单引号包裹,字段名不要额外加引号,避免被识别为常量导致条件失效
示例数据执行结果
基于你提供的测试数据,上述语句执行后返回结果如下,完全匹配你需要的字段格式:
CreatedId | CreatedDesc | Value | CreatedDate | CompletedId | CompletedDesc | CompletedDate | Status -------------------------------------------------------------------------------------------------------- 125 | X100-1 | 100 | 2022/01/01 | 127 | Z4000 | 2022/01/01 | COMPLETE 127 | Z4000 | 100 | 2022/01/12 | 126 | X100-2 | 2022/01/14 | COMPLETE
内容的提问来源于stack exchange,提问作者softy
相关产品推荐
相关产品推荐

