使用 WHERE 子句连接多个表

JOIN multiple tables with WHERE clauses

我有一个主 table(项目列表)以及几个子 table,它们连接在一个公共字段 (RecNum) 上。我需要按列获取所有子 table 的总计,但我不确定该怎么做。这是 table 设计的示例。每个 table 中还有更多列,但我展示了列名称和值的示例,以了解要做什么。

项目清单
|记录号 |
| 6 |

周A
|记录号 |用户名 |第一天注册 |第 1 天 |第二天注册 |第 2 天 |第三天注册 |第 3 天 |
| 6 |就我| 1 | 2 | 3 | 4 | 5 | 6 |
| 6 |不是我 | 1 | 2 | 3 | 4 | 5 | 6 |

周B
|记录号 |用户名 |第一天注册 |第 1 天 |第二天注册 |第 2 天 |第三天注册 |第 3 天 |
| 6 |就我| 7 | 8 | 1 | 2 | 3 | 4 |
| 6 |不是我 | 7 | 8 | 1 | 2 | 3 | 4 |

所以第一个查询应该 return 两个用户的完整总数,如下所示:

| sumDay1Reg | sumDay1OT | sumDay2Reg | sumDay2OT | sumDay3Reg | sumDay3OT |
| 16 | 20 | 8 | 12 | 16 | 20 |

第二个查询应该 return 仅指定用户 (WHERE UserName = 'JustMe') 的总数,如下所示:

| sumDay1Reg | sumDay1OT | sumDay2Reg | sumDay2OT | sumDay3Reg | sumDay3OT |
| 8 | 10 | 4 | 6 | 8 | 10 |
SELECT
  (SUM(a.Day1Reg + b.Day1Reg)) AS sumDay1Reg,
  (SUM(a.Day1OT + b.Day1OT)) AS sumDay1OT,
  (SUM(a.Day2Reg + b.Day2Reg)) AS sumDay2Reg,
  (SUM(a.Day2OT + b.Day2OT)) AS sumDay2OT,
  (SUM(a.Day3Reg + b.Day3Reg)) AS sumDay3Reg,
  (SUM(a.Day3OT + b.Day3OT)) AS sumDay3OT
FROM WeekA a,
     WeekB b
WHERE a.userName = 'JustMe' AND b.userName = 'JustMe' --Comment this out for first query

让多个 table 存储相同类型的数据是个坏主意;你应该有一个 Weeks table 有一个额外的一周列。

无论如何,处理这个table结构最简单的方法是先组合table:

SELECT SUM(Day1Reg) AS sumDay1Reg,
       SUM(Day10T)  AS sumDay10T,
       ...
FROM (SELECT * FROM WeekA
      UNION ALL
      SELECT * FROM WeekB)
WHERE userName = 'JustMe'  -- optional