使用MS Query中的多个INNER JOIN在FROM子句中进行子查询的语法

我已经尝试了几天(grrr)使用MS Query中的手动SQL语句窗口从ODBC连接的数据库中提取数据。 我可以看到我想要做的是什么,但是挂起了语法(我很确定它是特定于MS Query的)。

问题是这样的:

我有四个表格: waybill, waybill_item, rail_blrail_bl_item ,它们之间包含有关通过rail_bl_item处理的重量的信息,货物可以被路由到卡车(运货单)或轨道(铁路)上。 waybillrail_bl表分别包含卡车和铁路货物的date数据; 而waybill_itemrail_bl_item包含这些项目的权重数据。

我想要一张桌子,可以返回每天处理的总重量(包括铁路和卡车)。 IE

 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的总重量,所以我的结果是这样的:

 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接受使用我的上述查询作为子查询,然后总结每个date的logging。 即使试图做我的查询作为子查询testing不起作用。

例如,尝试

 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查询是否有能力执行这样的子查询? 在此先感谢您的帮助。

为了使用这个作为子查询,你需要两个地方的别名。 首先,这些列需要一个名字。 其次,派生表需要一个名字:

 select * from (SELECT waybill.Creation_date, sum(waybil_item.weight) as Weight . . . union all . . . ) t order by 1 desc 

顺便说一下,你想要UNION ALL而不是UNION。 如果你碰巧在给定的date有相同的值,UNION会消除它们。