我最近一直在研究MySQL和SQL,但是我不得不使用MS Access。我凭借自己的SQL知识在自定义和创建查询方面取得了巨大的成功,但是现在我陷入了困境。我仍在尝试学习有关在查询中正确连接表的更多信息,根据到目前为止的经验,MS Access并没有使它变得任何简单。
我要查询5个表。 Table1(又称“ munic.ID”,又称“ munic”)是包含将名称连接到接下来的4个表的键的表。表2-4全部包含与表1中的单个条目相关的多个唯一记录。当我将每个表与Table1仅作为一对查询时,我得到的正是我需要的结果。但是,当我尝试一起查询Tables1-4时,我得到的条目数是原来的4倍(例如,Table2记录在结果电子表格中的显示次数要多3至6次)。这也是有问题的,因为我正在尝试为Tables2-4中的数据值求和,并且记录的4倍时,我的总和要大4倍。
注意:每个表中与表1中的键相关联的记录没有偶数(表2具有35个条目,表3具有12个条目,等等)
样本数据:
select
a.patient_id as id1,
b.patient_id as id2,
a.person_name
from my_table a
join my_table b on a.patient_id = b.related_patient_id
and b.patient_id = a.related_patient_id
and a.product <> b.product
and a.patient_id < b.patient_id
因此,这是我一直在处理的查询: 用2个表查询,提供准确的结果(woo!)
Table1
ID municipalities county population website
1 Anson Somerset 2452 ansonmaine.town
2 Arrowsic Sagadahoc 440 arrowsic.org/recycling
Table2
ID waste-ID munic-ID report-year tons cubic-yards dest-fac-ID origin
1 45 1 2017 594 0 Maine
2 28 1 2017 4 Maine
查询所有表(提供太多重复项,这很痛苦):
SELECT DISTINCT
Table1.municipalities,
Table2.[report-year],
Sum(Table2.tons) AS [disp-tons],
Sum(Table2.[cubic-yards]) AS [disp-cubic-yards], Count(Table2.ID) AS [disp-no-entries]
FROM Table1 INNER JOIN Table2 ON Table1.ID = Table2.[munic-ID]
GROUP BY Table1.municipalities, Table2.[report-year];
如果对如何使用它有任何建议,那么当我查询Table1.municipality并加入Table1 ID时,我不会重复输入,这将非常有帮助。我曾尝试对查询中的数据进行分组,但MS要求对所有内容进行分组,而不仅仅是一个字段。我也已经完成了数学运算,当我在选择值时尝试对我的值求和时,我得到的总数应该是它的4倍。
预期结果:
SELECT DISTINCT
Table1.municipalities,
[Table2.tons] AS Table2_tons,
Table2.[cubic-yards] AS [Table2_cubic-yards],
Table3.tons AS Table3_tons,
Table3.[cubic-yards] AS [Table3_cubic-yards],
Table4.tons AS Table4_tons,
Table4.[cubic-yards] AS [Table4_cubic-yards],
[Table5].tons AS [Table5_tons],
[Table5].[cubic-yards] AS [Table5_cubic-yards]
FROM (((Table1 LEFT JOIN Table3 ON Table1.[ID] = Table3.[munic-ID]) LEFT JOIN Table2 ON Table1.[ID] = Table2.[munic-ID]) LEFT JOIN Table4 ON Table1.[ID] = Table4.[munic-ID]) LEFT JOIN [Table5] ON Table1.[ID] = [Table5].[munic-ID]
ORDER BY Table1.municipalities;
实际结果:
municipalities recycle_tons recycle_cubic-yards disposal_tons disposal_cubic-yards reuse_tons reuse_cubic-yards ben-use_tons ben-use_cubic-yards
Anson 2017 114 2 598 0 0 0 0 0
Anson 2016 66 3 946 0 0 0 0 0
Arrowsic 2017 59 0 121 0 0 0 23 0
Arrowsic 2016 0 0 121 0 0 0 23 0
Auburn 2016 0 0 21428 0 0 0 1538 0
希望有人可以提供帮助!我渴望学习正确的方法来构建这种复杂的查询,因为我经常不得不从几个不合逻辑的MS Access数据库中编译大量数据(我是从以前的数据库继承过来的)。
更新: 下面是我尝试合并记录的5个表的示例(不是行,但是每个表都应添加为新列-但每个表的记录数并不均匀)
municipalities report-year recycle_tons recycle_cubic-yards disposal_tons disposal_cubic-yards reuse_tons reuse_cubic-yards ben-use_tons ben-use_cubic-yards
Anson 2016 1 34
Anson 2016 1 157
Anson 2016 1 755
Anson 2016 3 34
Anson 2016 3 157
Anson 2016 3 755
Anson 2016 21 34
Anson 2016 21 157
Anson 2016 21 755
Anson 2016 43 34
Anson 2016 43 157
Anson 2016 43 755
Anson 2016 46 34
Anson 2016 46 157
Anson 2016 46 755
Anson 2017 1 4
Anson 2017 1 594
Anson 2017 3 4
Anson 2017 3 594
Anson 2017 21 4
Anson 2017 21 594
Anson 2017 43 4
Anson 2017 43 594
Anson 2017 46 4
Anson 2017 46 594
Arrowsic 2016 0 121 8
答案 0 :(得分:0)
让我们假设您在Table2中有2条记录,其中[munic-id]
为1,而在Table3中有3条记录,那么将所有3个表联接在一起将得到2x3 = 6条记录,结果为[munic-id]
1.
由于您似乎计划对所有表{Table2-5}的tons
和[cubic-yards]
进行汇总,并按[munic-id]
和[report-year]
分组,因此我建议在4中这样做分别查询(Query2-5),然后联接查询而不是表。由于表1中的人口会随着时间而变化,因此我建议也有一个表(munic-pop
),其中包含每个[munic-id]
的{{1}}的人口,这将有助于加入年份。
加入的查询可能看起来像这样(不再需要分组):