【发布时间】: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。
-
我已经编辑了我的问题以提供请求的数据。感谢您迄今为止的帮助,如果我应该提供任何其他信息,请告知。