在 MS Query 中使用多个 INNER JOIN 的 FROM 子句中的子查询的语法
Posted
技术标签:
【中文标题】在 MS Query 中使用多个 INNER JOIN 的 FROM 子句中的子查询的语法【英文标题】:Syntax for subqueries in the FROM clause using multiple INNER JOIN's in MS Query 【发布时间】:2012-09-13 18:36:43 【问题描述】:几天来,我一直在尝试 (grrr) 使用 MS Query 中的手动 SQL 语句窗口从连接 ODBC 的数据库中提取数据。我可以看到我想做的事情,但是我对语法很感兴趣(我很确定它是特定于 MS Query 的)。
问题是这样的:
我有四个表:waybill, waybill_item, rail_bl
和 rail_bl_item
,它们之间包含有关通过运输设施处理的重量的信息,货物要么被运送到卡车(运单)上,要么被运送到铁路(铁路)上。 waybill
和rail_bl
表分别包含卡车和铁路货物的日期数据;而waybill_item
和rail_bl_item
包含有关这些物品重量的数据。
我想要一个表格,该表格将返回每天处理的总重量(铁路和卡车运输)。即。
DATE | WEIGHT
date1, (truck_weight_for_date1+rail_weight_for_date1)
date2, (truck_weight_for_date2+rail_weight_for_date2)
date3, (truck_weight_for_date3+rail_weight_for_date3)
etc
通过执行查询,
SELECT waybill.creation_date, sum(waybill_item.weight)
FROM waybill
INNER JOIN waybill_item
ON waybill.id = waybill_item.waybill_id
WHERE waybill.creation_date > '01/01/2012'
GROUP BY waybill.creation_date
UNION
SELECT rail_bl.creation_date, sum(rail_bl_item.total_weight)
FROM rail_bl
INNER JOIN rail_bl_item
ON rail_bl.id = rail_bl_item.rail_bl_id
WHERE rail_bl.creation_date > '01/01/2012'
GROUP BY rail_bl.creation_date
ORDER BY waybill.creation_date DESC
我能够得到一个包含给定日期卡车总重量的两列结果 以及给定日期的铁路总重量在单独的记录中,所以我的结果如下所示:
DATE | WEIGHT
date1, truck_weight_for_date1
date1, rail_weight_for_date1
date2, truck_weight_for_date2
date2, rail_weight_for_date2
date3, truck_weight_for_date3
date3, rail_weight_for_date3
etc
我遇到的问题是我无法让 MS Query 接受使用上述查询作为 子查询,然后对每个日期的记录求和。即使尝试将我的查询作为子查询进行测试也不起作用。
例如尝试
SELECT * FROM
(
SELECT waybill.creation_date, sum(waybill_item.weight)
FROM waybill
INNER JOIN waybill_item
ON waybill.id = waybill_item.waybill_id
WHERE waybill.creation_date > '01/01/2012'
GROUP BY waybill.creation_date
UNION
SELECT rail_bl.creation_date, sum(rail_bl_item.total_weight)
FROM rail_bl
INNER JOIN rail_bl_item
ON rail_bl.id = rail_bl_item.rail_bl_id
WHERE rail_bl.creation_date > '01/01/2012'
GROUP BY rail_bl.creation_date
)
ORDER BY waybill.creation_date DESC
返回“无法添加表'('”错误。其他语法变体返回类似错误。
有谁知道 MS Query 如何——或者即使——能够执行这样的子查询?提前感谢您的帮助。
【问题讨论】:
【参考方案1】:为了将其用作子查询,您需要在两个地方使用别名。首先,列需要一个名称。二、派生表需要一个名字:
select *
from (SELECT waybill.Creation_date, sum(waybil_item.weight) as Weight
. . .
union all
. . .
) t
order by 1 desc
顺便说一句,您需要 UNION ALL 而不是 UNION。如果您在给定日期碰巧有相同的值,UNION 会消除它们。
【讨论】:
感谢您的反馈,戈登。我现在遇到的问题只是试图分配一个别名,即使只有一个带有 INNER JOIN 的选择。如果我尝试SELECT waybill.creation_date, sum(waybill_item.weight) AS Total_Weight FROM waybill INNER JOIN waybill_item ON waybill.id = waybill_item.waybill_id WHERE waybill.creation_date > '01/01/2012' GROUP BY waybill.creation_date
,重量字段的标题保持空白,返回 SQL 窗口显示“AS Total_Weight”已消失。有什么建议么?我对此很陌生。以上是关于在 MS Query 中使用多个 INNER JOIN 的 FROM 子句中的子查询的语法的主要内容,如果未能解决你的问题,请参考以下文章
在 Oracle SQL Query 中加入(INNER JOIN)本地 Excel 表 - VBA
使用 group by、inner query 和 count 优化查询