Return 来自 table 1 的记录,即使 table 2 没有匹配的记录
Return record from table 1 even if table 2 has no matching record
我才刚刚开始学习 SQL 所以如果这是一个非常基本的问题,请多多包涵,但这是我正在尝试做的事情。
我正在写查询 return 单个设备的历史记录。我从三个不同的 tables 中提取,一个列出每个设备的序列号(节点),一个列出每个设备是否每天在线(节点状态),第三个列出每个设备的位置何时发生变化(位置状态)。
我想从节点状态 table 中提取每条记录 如果 位置状态中有记录 table 我想把它也带来。下面的查询将 return 我想要的信息,但前提是在两个 table 中都有匹配的更改记录。
[Node Status].Online, Nodes.[Node Serial Number], [Node Status].Gateway,
[Node Status].[Date Verified], [Node Location Status].[Location ID],
[Node Location Status].[Install/Remove], [Node Location Status].[Date of Action]
FROM
(Nodes
INNER JOIN
[Node Status] ON Nodes.NodeID = [Node Status].[Node Serial])
INNER JOIN
[Node Location Status] ON (Nodes.NodeID = [Node Location Status].[Node Serial Number])
AND ([Node Status].[Date Verified] = [Node Location Status].[Date of Action])
WHERE
((Nodes.[Node Serial Number]) = [Enter node serial number]);
*注意:你们中的许多人都建议使用 LEFT JOIN,这似乎是正确的答案,但看起来我遗漏了一些重要的信息。我在 Access 中写这个,它显然不支持 LEFT JOIN。
我想你应该使用 left join
意思是如果你在内部连接周围的某个地方得到你想要的 o/p 将它替换为 left join
使用 LEFT JOIN 而不是 INNER JOIN。您将从主 table 'Nodes' 获得所有记录以及其他 tables
的匹配行
如果要将行保留在一个 table 中,则需要 LEFT JOIN
,即使在其他 table 中没有匹配项。
因为您希望 [Node Status]
中的所有行都应该是第一个 table。所有后续连接都应为 LEFT JOIN
s:
SELECT ns.Online, n.[Node Serial Number], ns.Gateway,
ns.[Date Verified], nls.[Location ID],
nls.[Install/Remove], nls.[Date of Action]
FROM [Node Status] ns LEFT JOIN
Nodes n
ON n.NodeID = ns.[Node Serial] LEFT JOIN
[Node Location Status] nls
ON n.NodeID = nls.[Node Serial Number] AND
ns.[Date Verified] = nls.[Date of Action])
WHERE n.[Node Serial Number]) = [Enter node serial number];
请注意,我从 FROM
子句中删除了多余的括号并添加了 table 别名。两者都使查询更易于阅读。
编辑:
MS Access 不支持 "normal" SQL 语法。你必须稍微调整一下:
SELECT ns.Online, n.[Node Serial Number], ns.Gateway,
ns.[Date Verified], nls.[Location ID],
nls.[Install/Remove], nls.[Date of Action]
FROM ([Node Status] as ns LEFT JOIN
Nodes as n
ON n.NodeID = ns.[Node Serial]
) LEFT JOIN
[Node Location Status] as nls
ON n.NodeID = nls.[Node Serial Number] AND
ns.[Date Verified] = nls.[Date of Action])
WHERE n.[Node Serial Number]) = [Enter node serial number];
根据您的描述,我建议如下:
select
ns.online,
n.[node serial number],
ns.gateway,
ns.[date verified],
nls.[location id],
nls.[install/remove],
nls.[date of action]
from
(
nodes n inner join [node status] ns on
n.nodeid = ns.[node serial]
)
left join [node location status] nls on
ns.[node serial] = nls.[node serial number] and
ns.[date verified] = nls.[date of action]
where
n.[node serial number] = [Enter node serial number]
鉴于用户正在从 Nodes
table 中指定序列号,并且您声明要查看 all 中的条目 Node Status
table,这应该是一个 inner join
,其中 left join
到 Node Location Status
table 到 return 空值是有道理的值不存在。
请注意,别名 n
、ns
和 nls
纯粹是为了节省一些输入。
我不确定您为什么认为 MS Access 不支持 left join
,因为它确实支持!
我才刚刚开始学习 SQL 所以如果这是一个非常基本的问题,请多多包涵,但这是我正在尝试做的事情。
我正在写查询 return 单个设备的历史记录。我从三个不同的 tables 中提取,一个列出每个设备的序列号(节点),一个列出每个设备是否每天在线(节点状态),第三个列出每个设备的位置何时发生变化(位置状态)。
我想从节点状态 table 中提取每条记录 如果 位置状态中有记录 table 我想把它也带来。下面的查询将 return 我想要的信息,但前提是在两个 table 中都有匹配的更改记录。
[Node Status].Online, Nodes.[Node Serial Number], [Node Status].Gateway,
[Node Status].[Date Verified], [Node Location Status].[Location ID],
[Node Location Status].[Install/Remove], [Node Location Status].[Date of Action]
FROM
(Nodes
INNER JOIN
[Node Status] ON Nodes.NodeID = [Node Status].[Node Serial])
INNER JOIN
[Node Location Status] ON (Nodes.NodeID = [Node Location Status].[Node Serial Number])
AND ([Node Status].[Date Verified] = [Node Location Status].[Date of Action])
WHERE
((Nodes.[Node Serial Number]) = [Enter node serial number]);
*注意:你们中的许多人都建议使用 LEFT JOIN,这似乎是正确的答案,但看起来我遗漏了一些重要的信息。我在 Access 中写这个,它显然不支持 LEFT JOIN。
我想你应该使用 left join
意思是如果你在内部连接周围的某个地方得到你想要的 o/p 将它替换为 left join
使用 LEFT JOIN 而不是 INNER JOIN。您将从主 table 'Nodes' 获得所有记录以及其他 tables
的匹配行如果要将行保留在一个 table 中,则需要 LEFT JOIN
,即使在其他 table 中没有匹配项。
因为您希望 [Node Status]
中的所有行都应该是第一个 table。所有后续连接都应为 LEFT JOIN
s:
SELECT ns.Online, n.[Node Serial Number], ns.Gateway,
ns.[Date Verified], nls.[Location ID],
nls.[Install/Remove], nls.[Date of Action]
FROM [Node Status] ns LEFT JOIN
Nodes n
ON n.NodeID = ns.[Node Serial] LEFT JOIN
[Node Location Status] nls
ON n.NodeID = nls.[Node Serial Number] AND
ns.[Date Verified] = nls.[Date of Action])
WHERE n.[Node Serial Number]) = [Enter node serial number];
请注意,我从 FROM
子句中删除了多余的括号并添加了 table 别名。两者都使查询更易于阅读。
编辑:
MS Access 不支持 "normal" SQL 语法。你必须稍微调整一下:
SELECT ns.Online, n.[Node Serial Number], ns.Gateway,
ns.[Date Verified], nls.[Location ID],
nls.[Install/Remove], nls.[Date of Action]
FROM ([Node Status] as ns LEFT JOIN
Nodes as n
ON n.NodeID = ns.[Node Serial]
) LEFT JOIN
[Node Location Status] as nls
ON n.NodeID = nls.[Node Serial Number] AND
ns.[Date Verified] = nls.[Date of Action])
WHERE n.[Node Serial Number]) = [Enter node serial number];
根据您的描述,我建议如下:
select
ns.online,
n.[node serial number],
ns.gateway,
ns.[date verified],
nls.[location id],
nls.[install/remove],
nls.[date of action]
from
(
nodes n inner join [node status] ns on
n.nodeid = ns.[node serial]
)
left join [node location status] nls on
ns.[node serial] = nls.[node serial number] and
ns.[date verified] = nls.[date of action]
where
n.[node serial number] = [Enter node serial number]
鉴于用户正在从 Nodes
table 中指定序列号,并且您声明要查看 all 中的条目 Node Status
table,这应该是一个 inner join
,其中 left join
到 Node Location Status
table 到 return 空值是有道理的值不存在。
请注意,别名 n
、ns
和 nls
纯粹是为了节省一些输入。
我不确定您为什么认为 MS Access 不支持 left join
,因为它确实支持!