【问题标题】:SQL query to show values from one table that are in between column values in a different tableSQL查询显示一个表中的值在不同表的列值之间
【发布时间】:2016-07-26 18:34:46
【问题描述】:

所以我有两张桌子。一个表 (tbl1) 包含按建筑物划分的子网信息,列名称为ip_address、位置、服务器、建筑物、起始 IP、结束 IP 和子网掩码

我有另一个表 (tbl2),其中包含名为 顶级控制台用户、计算机名称、IP 地址、计算机型号、计算机操作系统和计算机序列号的列

我想创建一个报告,列出 tbl2 中位于 tbl1 中起始 IP 和结束 IP 之间的 IP 地址。因此,例如,如果来自 tbl2 的计算机的 IP 地址为 172.16.1.4,而 tbl1 的建筑物的起始 IP 为 172.16.1.1,结束 IP 为 172.16.1.254,我希望能够在我的报告中看到这一点。

两个表中都没有类似的列,因此使用 JOIN 语句对我来说并没有真正起作用。我还在我的报告中使用参数(如果这很重要)。任何帮助将不胜感激。

更新:

我知道这很多,但它让我成功了一半。我创建了一个转换值但不知道如何调用的函数。还有指点吗??

SELECT * FROM Subnets_And_Locations,
 (SELECT Computer_System_DATA.UserName00 AS Top_Console_User, 
Computer_System_DATA.Name00 + '.' + Computer_System_DATA.Domain00 AS Computer_Name,
System_IP_Address_ARR.IP_Addresses0 AS IP_Address, 
Computer_System_DATA.Model00 AS Model, 
Operating_System_DATA.Caption00 AS Operating_System,
PC_BIOS_DATA.SerialNumber00 AS Serial_Number 
FROM     Computer_System_DATA 
INNER JOIN Operating_System_DATA ON Computer_System_DATA.MachineID = Operating_System_DATA.MachineID
INNER JOIN System_IP_Address_ARR ON Computer_System_DATA.MachineID = System_IP_Address_ARR.ItemKey
INNER JOIN PC_BIOS_DATA ON Computer_System_DATA.MachineID = PC_BIOS_DATA.MachineID) AS Scope
WHERE Scope.IP_Address >= Subnets_And_Locations.Starting_IP AND Scope.IP_Address <= Subnets_And_Locations.Ending_IP
;

【问题讨论】:

  • 我不确定是否有办法查询这样的数字范围(虽然不是 100% 肯定)。我的建议是更改 IP 地址在表中的存储方式,以使此类查询成为可能。我找到了this,它可能有助于数据的存储方式。
  • 范围仅由最后 2 个八位字节或最后 3 个字节决定?
  • 范围由最后 2 个八位字节决定。

标签: sql sql-server sccm


【解决方案1】:

我建议首先将 ip 部分转换为相应的完整格式并删除点。例如,将 172.16.1.254 转换为 172016001254,然后只需执行 &gt;=&lt;= 即可轻松比较范围。您甚至可以预先存储这些值以加快此过程。顺便说一句,连接完全没问题。只需使用 on 子句中的条件即可。

【讨论】:

  • 由于 IPv4 有 4 个数字,最多可达 255(或十六进制 FF),最好将它们直接转换为 int 以便数字系列中没有间隙,这可能在以后有用 - 所以172.16.1.254 是 2886730238,你可以像处理数字一样处理一切。
  • 所以我需要创建一个函数?
  • 我猜这做得太多了。我建议在现有表中添加一列。
【解决方案2】:
Select a.IP_address,
a.location,
a.server,
a.building,
b.*

from table_1 a
join table_2 b on b.ip_address >= a.[starting ip] 
 and b.ip_address <= a.[ending ip]

这应该对你有用,或者你可以这样尝试

Select a.IP_address,
a.location,
a.server,
a.building,
b.*

from table_2 b
join table_1 a on b.ip_address >= a.[starting ip] 
 and b.ip_address <= a.[ending ip]

我不确定您希望报告中的内容。您可能还需要添加一个过滤器,但如果不亲自尝试就很难说清楚。

【讨论】:

    猜你喜欢
    • 2016-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多