Sql 如何按顺序查询不同表中的数据

Sql 如何按顺序查询不同表中的数据,sql,sql-server,Sql,Sql Server,我需要更改此代码,但不知道如何更改 我需要它从这些表中按此顺序检查数据 头饰, MAC_地址, 如果找不到数据,“无Mac地址” SNMP中的Mac地址自动存储在一个名为NodeCadAddresss的表中,但有些单元不响应SNMP,所以我手动将它们添加到我创建的名为Mac_地址的表中。因此,我需要首先检查NodeCadAddresss中是否有数据,然后检查MAC_地址,如果两个表都包含NULL,则键入“No MAC address” select coalesce(max(MAC), 'No

我需要更改此代码,但不知道如何更改

我需要它从这些表中按此顺序检查数据 头饰, MAC_地址, 如果找不到数据,“无Mac地址”

SNMP中的Mac地址自动存储在一个名为NodeCadAddresss的表中,但有些单元不响应SNMP,所以我手动将它们添加到我创建的名为Mac_地址的表中。因此,我需要首先检查NodeCadAddresss中是否有数据,然后检查MAC_地址,如果两个表都包含NULL,则键入“No MAC address”

select coalesce(max(MAC), 'No Mac Address')
from NodeMACAddresses 
where NodeID = $@nodeid@;

嗯。这里有一种方法:

select coalesce((select max(MAC)
                 from NodeMACAddresses 
                 where NodeID = $@nodeid@
                ),
                (select max(MAC)
                 from MACAddress
                 where NodeID = $@nodeid@
                ),
                'No Mac Address'
               )

嗯。这里有一种方法:

select coalesce((select max(MAC)
                 from NodeMACAddresses 
                 where NodeID = $@nodeid@
                ),
                (select max(MAC)
                 from MACAddress
                 where NodeID = $@nodeid@
                ),
                'No Mac Address'
               )

您可以对所有结果进行排序,然后提取第一个结果

SELECT
    *
FROM
(
    SELECT 
        NodeId,MAC,Priority,
        RN=ROW_NUMBER() OVER(PARTITION BY NodeID ORDER BY Priority DESC) 
    FROM
    (
        SELECT NodeID,MAC, Priority=1 FROM NodeMACAddresses WHERE  NodeID=@NodeID
        UNION 
        SELECT NodeID,MAC, Priority=2 FROM MAC_Address WHERE NodeID=@NodeID
        UNION
        SELECT NodeID=@nodeid, MAC = 'No Mac Address', Priority=3
    )AS A
)AS B
WHERE
    RN=1
或者没有排名

SELECT
    NodeId=@NodeID,
    MAC=COALESCE(A.MAC,B.MAC,C.MAC)
FROM
(
    SELECT MAC = 'No Mac Address' 
)AS C
LEFT OUTER JOIN NodeMACAddresses A ON A.NodeID=@NodeID
LEFT OUTER JOIN MAC_Address B ON B.NodeID=@NodeID 

您可以对所有结果进行排序,然后提取第一个结果

SELECT
    *
FROM
(
    SELECT 
        NodeId,MAC,Priority,
        RN=ROW_NUMBER() OVER(PARTITION BY NodeID ORDER BY Priority DESC) 
    FROM
    (
        SELECT NodeID,MAC, Priority=1 FROM NodeMACAddresses WHERE  NodeID=@NodeID
        UNION 
        SELECT NodeID,MAC, Priority=2 FROM MAC_Address WHERE NodeID=@NodeID
        UNION
        SELECT NodeID=@nodeid, MAC = 'No Mac Address', Priority=3
    )AS A
)AS B
WHERE
    RN=1
或者没有排名

SELECT
    NodeId=@NodeID,
    MAC=COALESCE(A.MAC,B.MAC,C.MAC)
FROM
(
    SELECT MAC = 'No Mac Address' 
)AS C
LEFT OUTER JOIN NodeMACAddresses A ON A.NodeID=@NodeID
LEFT OUTER JOIN MAC_Address B ON B.NodeID=@NodeID 


呈现您的模式并尝试清楚地表述您想要实现的内容呈现您的模式并尝试清楚地表述您想要实现的内容如果不起作用,我得到宏SQL错误-接近“00”的语法不正确。代码看起来像这样``$SQL:select coalesceselect maxMAC from nodemacadireds其中NodeID=$@NodeID@,select maxMAC from${MAC_Addresses}其中NodeID=$@NodeID@,“没有Mac地址”``我还更新了原来的问题。对不起,我不清楚。@spifa。我不知道您为什么使用宏引用表,但问题不在于查询,而在于宏预处理。@spifa,为什么您在${}中有MAC_地址,而在nodemacadires中没有?此外,您的帖子称它为MAC_地址,而不是MAC_地址。@GreyOrGray nodemacadires是由软件创建的表。MAC_地址是我自己创建的一个表,因此我必须将它放在${}中。它应该是MAC_地址,这是一个输入错误。@GordonLinoff我把代码放在一个html格式的消息框中,然后发送出去。我需要从SQL开始,否则它将是纯文本。不起作用,我得到宏SQL错误-靠近“00”的语法不正确。代码看起来像这样``$SQL:select coalesceselect maxMAC from nodemacadireds其中NodeID=$@NodeID@,select maxMAC from${MAC_Addresses}其中NodeID=$@NodeID@,“没有Mac地址”``我还更新了原来的问题。对不起,我不清楚。@spifa。我不知道您为什么使用宏引用表,但问题不在于查询,而在于宏预处理。@spifa,为什么您在${}中有MAC_地址,而在nodemacadires中没有?此外,您的帖子称它为MAC_地址,而不是MAC_地址。@GreyOrGray nodemacadires是由软件创建的表。MAC_地址是我自己创建的一个表,因此我必须将它放在${}中。它应该是MAC_地址,这是一个输入错误。@GordonLinoff我把代码放在一个html格式的消息框中,然后发送出去。我需要从SQL开始,否则它将是纯文本。我不确定最大值在原始查询中的含义。如果每个节点有多个MAC,如果可能的话,您想要或MAX/MIN吗?我没有编写查询。我甚至不知道max做了什么。对于排名,我得到:宏SQL错误-必须声明标量变量@NodeID。必须声明标量变量@NodeID。必须声明标量变量@nodeid。没有排名我得到:宏SQL错误-必须声明标量变量@NodeID。关键字“AS”附近的语法不正确。只需将@NodeID替换为要测试的硬编码值即可。它是同义词$@nodeid@I我不确定原始查询中最大值的含义。如果每个节点有多个MAC,如果可能的话,您想要或MAX/MIN吗?我没有编写查询。我甚至不知道max做了什么。对于排名,我得到:宏SQL错误-必须声明标量变量@NodeID。必须声明标量变量@NodeID。必须声明标量变量@nodeid。没有排名我得到:宏SQL错误-必须声明标量变量@NodeID。关键字“AS”附近的语法不正确。只需将@NodeID替换为要测试的硬编码值即可。它是$@nodeid的同义词@