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 JOINs:

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 joinNode Location Status table 到 return 空值是有道理的值不存在。

请注意,别名 nnsnls 纯粹是为了节省一些输入。

我不确定您为什么认为 MS Access 不支持 left join,因为它确实支持!