Firebird SQL多表关联查询:替换PointID为对应pointName
Firebird SQL 关联查询替换点ID为点名称
我几乎没接触过SQL,现在内部硬件的测试数据存在Firebird SQL数据库里,已经理清了数据结构,目前用下面的SQL获取指定testID的记录:
SELECT * FROM RESULTS r JOIN RECORDS re on ((r.testID = re.testID) AND (r.runID = re.runID) AND (r.resultID = re.resultID))
现在需要把记录里的startPointID和endPointID替换成对应的pointName,关联逻辑如下:
- 根据testID和startConnectionIndex/endConnectionIndex在Connection表中查询connectionID;
- 再根据testID、connectionID和startPointID/endPointID在Point表中获取对应的pointName。
期望最终输出包含testID、runID、resultID、recordedValue、endPointID、endPointName等字段,示例如下:
| testID | runID | resultID | recordedValue | ... | endPointID | endPointName |
|---|---|---|---|---|---|---|
| 1001 | 1 | 3 | value1 | ... | p-1 | Point A |
| 1001 | 1 | 3 | value2 | ... | p-2 | Point B |
涉及的表结构:
- Results表:包含testID、runID、resultID字段;
- Records表:包含testID、runID、resultID、recordedValue、startConnectionIndex、startPointID、endConnectionIndex、endPointID字段;
- Connection表:包含testID、connectionIndex、connectionID字段;
- Point表:包含testID、pointID、connectionID、pointName字段。
最终SQL语句
SELECT r.testID, r.runID, r.resultID, re.recordedValue, -- 保留原ID字段,同时添加对应的名称 re.startPointID, start_point.pointName AS startPointName, re.endPointID, end_point.pointName AS endPointName -- 如需其他字段,可在此添加,比如 re.xxx FROM RESULTS r JOIN RECORDS re ON r.testID = re.testID AND r.runID = re.runID AND r.resultID = re.resultID -- 关联获取startConnection对应的connectionID,再关联Point表拿startPointName LEFT JOIN Connection start_conn ON re.testID = start_conn.testID AND re.startConnectionIndex = start_conn.connectionIndex LEFT JOIN Point start_point ON re.testID = start_point.testID AND start_conn.connectionID = start_point.connectionID AND re.startPointID = start_point.pointID -- 关联获取endConnection对应的connectionID,再关联Point表拿endPointName LEFT JOIN Connection end_conn ON re.testID = end_conn.testID AND re.endConnectionIndex = end_conn.connectionIndex LEFT JOIN Point end_point ON re.testID = end_point.testID AND end_conn.connectionID = end_point.connectionID AND re.endPointID = end_point.pointID -- 如需指定testID,添加WHERE条件 -- WHERE r.testID = '你的测试ID'
说明
- 使用
LEFT JOIN而非INNER JOIN,避免因为某个连接或点不存在导致整条记录丢失; - 分别对start和end的连接、点进行两次关联,确保各自的名称正确匹配;
- 保留了原
startPointID和endPointID字段,同时添加了对应的startPointName和endPointName; - 如果需要筛选特定testID,取消最后一行
WHERE注释并填入对应ID即可。
内容的提问来源于stack exchange,提问作者CircularRecursion
相关产品推荐
相关产品推荐

