【问题标题】:How to join multiple tables in MS Access如何在 MS Access 中连接多个表
【发布时间】:2021-11-17 03:03:09
【问题描述】:

我正在开发一个数据库,其中包含不同国家/地区多个码头的销售点数据。设置了一些表来删除原始 POS 数据,每种货币都有一个表。每种货币都设置在唯一的数据库代码下。我在每个表上运行多个查询。其中一个查询加入了下表“T_BLG”,以按位置代码提取唯一的船长组。

T_BLG

Location Code Min Boat Length Max Boat Length Boat Length Group
AYH 0.00 79.00 0-79
AYH 80.00 120.00 80-120
AYH 121.00 99,999.00 121+
OIP 0.00 100.00 0-100
OIP 101.00 200.00 101-200
OIP 201.00 99,999.00 201+

我能够使用以下语句将查询左连接到 T_BLG。

SELECT q_Step2_AMR.*, 

t_BLG.[Boat Length Group], 

[Database Code] & [HS Boat Code] AS [Unique Vessel ID By DB]

FROM q_Step2_AMR LEFT JOIN t_BLG 

ON q_Step2_AMR.[Location Code] = t_BLG.[Location Code]

WHERE (((q_Step2_AMR.[HS Boat Length 2]) Between [Min Boat Length] And [Max Boat Length]));

最近我有一个请求,要引入 Mega Attribute Length。我为这些条件建立了一个新表,并将该表命名为“T_MEGA”。

T_MEGA

Database Code Min Boat Length Max Boat Length Mega Attribute Length
AMR 0.00 150.00 0-150
AMR 151.00 249.00 151-249
AMR 250.00 99,999.00 250+
PCM 0.00 150.00 0-150
PCM 151.00 249.00 151-249
PCM 250.00 99,999.00 250+

下面是我想要的输出,前四个字段是 q_Step2_AMR:

Location Code Database Code HS Boat Code HS Boat Length 2 Unique Vessel ID by DB Boat Length Group Mega Attribute Length
AYH AMR A0001 50.00 AMRA0001 0-79 0-150
OIP PCM A0002 500.00 PCMA0002 201+ 250+

我可以按如下方式使用 UNION ALL:

SELECT q_Step2_AMR.*, t_BLG.[Boat Length Group], 
[Database Code] & [HS Boat Code] AS [Unique Vessel ID By DB]
FROM 
q_Step2_AMR 
LEFT JOIN 
t_BLG 
ON q_Step2_AMR.[Location Code] = t_BLG.[Location Code]
WHERE (((q_Step2_AMR.[HS Boat Length 2]) Between [Min Boat Length] And [Max Boat Length])) 

UNION ALL SELECT q_Step2_AMR.*, t_MEGA.[Mega Attribute Length],
"" AS [Unique Vessel ID By DB]
FROM 
q_Step2_AMR 
LEFT JOIN 
t_MEGA 
ON q_Step2_AMR.[Database Code] = t_MEGA.[Database Code] 
WHERE (((q_Step2_AMR.[HS Boat Length 2]) Between [Min Boat Length] And [Max Boat Length]));

但是,由于 Union All 在两个 Select 语句中都使用了 q_Step2_AMR,因此我基本上复制了我的数据。有比使用 UNION ALL 更好的选择吗?

【问题讨论】:

  • 你尝试了什么?您所说的“合并”是什么意思 - UNION 或 JOIN?将示例数据和所需输出显示为文本表。
  • 我尝试使用 UNION ALL。但是,由于我使用 AS 在第一个 SELECT 中引入 [Unique Vessel ID by DB],因此会导致列的差异。如果我删除 AS,则查询有效。有关我尝试失败的内容,请参见下文。我无法提供干净的输出,因为我正在处理的数据有 70 多个字段。
  • SELECT q_Step2_AMR.*, t_BLG.[Boat Length Group], [Database Code] & [HS Boat Code] AS [Unique Vessel ID By DB] FROM q_Step2_AMR LEFT JOIN t_BLG ON q_Step2_AMR.[Location Code ] = t_BLG.[Location Code] WHERE (((q_Step2_AMR.[HS Boat Length 2]) [Min Boat Length] 和 [Max Boat Length])) UNION ALL SELECT q_Step3_AMR.*, t_MEGA.[Mega Attribute Length] FROM q_Step3_AMR LEFT JOIN t_MEGA ON q_Step3_AMR.[Database Code] = t_MEGA.[Database Code] WHERE (((q_Step3_AMR.[HS Boat Length 2]) [Min Boat Length1] And [Max Boat Length1]));
  • 您应该编辑问题以显示尝试的 SQL。此外,提供已经建议的数据。可能不需要所有 70 个字段来说明需求。如果第二个查询没有对应的字段,则在该位置使用 NULL。
  • 我已经编辑了我的问题以提供请求的数据。感谢您迄今为止的帮助,如果我应该提供任何其他信息,请告知。

标签: sql ms-access


【解决方案1】:

您在评论中发布的 UNION ALL 代码不起作用(正如您所指出的),因为两个 SELECTS 具有不同数量的字段。要使其工作,您只需向第二个 SELECT 添加一个额外的常量字段,与字段 [Unique Vessel ID By DB] 具有相同的数据类型,这似乎是一个字符串。因此代码是:

   SELECT q_Step2_AMR.*, t_BLG.[Boat Length Group], [Database Code] & [HS Boat Code] AS [Unique Vessel ID By DB]
   FROM 
      q_Step2_AMR 
   LEFT JOIN 
      t_BLG 
   ON q_Step2_AMR.[Location Code] = t_BLG.[Location Code] 
   WHERE (((q_Step2_AMR.[HS Boat Length 2]) Between [Min Boat Length] And [Max Boat Length])) 

UNION ALL 

   SELECT q_Step3_AMR.*, t_MEGA.[Mega Attribute Length], "" AS [Unique Vessel ID By DB]
   FROM 
      q_Step3_AMR 
   LEFT JOIN 
      t_MEGA 
   ON q_Step3_AMR.[Database Code] = t_MEGA.[Database Code] 
   WHERE (((q_Step3_AMR.[HS Boat Length 2]) Between [Min Boat Length1] And [Max Boat Length1])); 

【讨论】:

  • 不需要相同的数据类型常量,可以使用NULL。第一个 SELECT 定义字段类型和名称。后续的 SELECT 语句中不需要 AS 别名。
  • 感谢您的回答。我对表格非常陌生,并且仍在学习曲线中工作,并且无法弄清楚如何在不超过字符限制的情况下使用更新的语句来回应您的答案。我已经用我当前的声明编辑了我的问题。很抱歉给您带来任何困惑,并感谢您迄今为止的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-22
  • 1970-01-01
  • 2022-12-10
  • 1970-01-01
相关资源
最近更新 更多