我有一个 Access 数据库,可以跟踪工厂车间的机器。我正在使用两个表:
marstable
- 每台机器已完成的操作列表statustable
- 机器状态更改列表
marstable
其中大约有 100,000 个条目,而statustable
少于 100 个。
我需要一次查找一台机器才能找到以下三件事之一:
- 如果机器在两个表中都有条目,则返回两个表中的数据。
- 如果机器只有 中的条目
marstable
,则返回该表中的数据。 - 如果机器只有 中的条目
statustable
,则返回该条目中的数据。
如何执行 SQL 查询来完成此操作? 现在,使用左连接,除了在statustable
(左连接的“右”部分)中只有数据的情况下,它可以工作。
marstable
是按时间顺序排列的交易列表,如下所示:
+--------+----------+-----------+----------+-----------------------+
| order | machine | operation | quantity | insertdate |
+--------+----------+-----------+----------+-----------------------+
| 12345 | A10 | 110 | 2339 | 11/16/2012 9:57:15 AM |
| 67890 | B11 | 450 | 10330 | 11/16/2012 9:15:03 AM |
+--------+----------+-----------+----------+-----------------------+
statustable
是按时间顺序排列的机器状态变化列表。看起来像:
+---------+--------+-----------------------+--------+
| machine | status | inserttime | note |
+---------+--------+-----------------------+--------+
| A10 | 6 | 11/5/2012 10:52:22 AM | broken |
| J90 | 7 | 11/9/2012 12:48:46 PM | robot |
+---------+--------+-----------------------+--------+
我使用的 SQL 查询如下所示:
SELECT TOP 1 [machine], [quantity], [order], [operation], [insertdate], [status], [inserttime], [note]
FROM [marstable] LEFT JOIN [statustable] ON [marstable].[machine] = [statustable].[machine]
WHERE [marstable].[machine] = '<<machine I want get's passed in here>>'
ORDER BY [marstable].[insertdate] DESC, [statustable].[inserttime] DESC
问题是,当 中不存在条目marstable
但 中有一个时statustable
,我仍然什么也得不到。
提前感谢您的帮助。此外,我无法控制表格的外观。
最后,请原谅我对上述表格缺乏 ascii-art Skillz。
更新#1:
我正在尝试从他下面的一个答案中实现@Olivier 的子查询解决方案。但是,当我这样做时,我得到一个错误 too few parameters. Expected 2.
我的实现与他的不同之处在于我将机器 ID 传递给生成 SQL 的函数,而不是请求参数。
SQL 是这样生成的
MarsSQL = _
"SELECT M.msg_machine, M.msg_qtyorstatus, M.msg_entity, M.msg_operation, M.msg_creator, M.msg_insertdate, " & _
"S.Machine, S.Status, S.InsertTime, S.Note, S.UserID " & _
"FROM " & _
"(SELECT TOP 1 msg_machine, msg_qtyorstatus, msg_entity, msg_operation, msg_creator " & _
"FROM MARSTable WHERE msg_machine = '" & "00" & fMachine & "' ORDER BY msg_insertdate DESC" & _
") M, " & _
"(SELECT TOP 1 Machine, Status, InsertTime, Note " & _
"FROM StatusTable WHERE Machine = '" & fMachine & "' ORDER BY InsertTime DESC" & _
") S;"
fMachine
是一个字符串,它包含我们当前正在寻找的机器。最终结果是 SQL 看起来像这样(对于机器 A10):
SELECT M.msg_machine, M.msg_qtyorstatus, M.msg_entity, M.msg_operation, M.msg_creator, M.msg_insertdate,
S.Machine, S.Status, S.InsertTime, S.Note, S.UserID
FROM
(SELECT TOP 1 msg_machine, msg_qtyorstatus, msg_entity, msg_operation, msg_creator
FROM MARSTable WHERE msg_machine = '00A10' ORDER BY msg_insertdate DESC
) M,
(SELECT TOP 1 Machine, Status, InsertTime, Note
FROM StatusTable WHERE Machine = 'A10' ORDER BY InsertTime DESC
) S;
注意:我最初的示例使用了表的简化版本,但这个 SQL 是我生成的实际 SQL。 另外,我已经尝试过在每个字段/表格周围使用和不使用[方括号],它没有任何区别。
更新#2:我错过了第二个子查询中的一个字段。我添加了它,现在我得到了同样的错误,除了它说我缺少1参数,而不是2。现在 SQL 看起来像这样:
SELECT M.msg_machine, M.msg_qtyorstatus, M.msg_entity, M.msg_operation, M.msg_creator, M.msg_insertdate,
S.Machine, S.Status, S.InsertTime, S.Note, S.UserID
FROM
(SELECT TOP 1 msg_machine, msg_qtyorstatus, msg_entity, msg_operation, msg_creator
FROM MARSTable WHERE msg_machine = '00A10' ORDER BY msg_insertdate DESC
) M,
(SELECT TOP 1 Machine, Status, InsertTime, Note, UserID
FROM StatusTable WHERE Machine = 'A10' ORDER BY InsertTime DESC
) S;
UserID
是我在第二个子查询中缺少的字段。
已解决:我在第一个子查询中缺少另一个字段。一旦我澄清了这一点,解决方案就奏效了。SQL 现在看起来像这样:
SELECT M.msg_machine, M.msg_qtyorstatus, M.msg_entity, M.msg_operation, M.msg_creator, M.msg_insertdate,
S.Machine, S.Status, S.InsertTime, S.Note, S.UserID
FROM
(SELECT TOP 1 msg_machine, msg_qtyorstatus, msg_entity, msg_operation, msg_creator, msg_insertdate
FROM MARSTable WHERE msg_machine = '00A10' ORDER BY msg_insertdate DESC
) M,
(SELECT TOP 1 Machine, Status, InsertTime, Note
FROM StatusTable WHERE Machine = 'A10' ORDER BY InsertTime DESC
) S;
感谢所有在这里提供帮助的人。