2016-07-26 54 views
0

所以我有两个表。一个表(tbl1)包含通过构建的子网信息,列名为ip_address,位置,服务器,建筑物,起始IP,结束IP和子网掩码SQL查询显示不同表中列值之间的值

我有另一个表(TBL2)与

命名顶部控制台用户列,计算机名称,IP地址,计算机模型,计算机操作系统和计算机序列号,我想创建一个报告,列出来自tbl2的IP地址落在tbl1中的起始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 
; 
+0

我不知道有一种方法来查询这样的数字范围(但不是100%肯定)。我的建议是改变IP地址在表格中的存储方式,以使这样的查询成为可能。我发现[this](http://stackoverflow.com/questions/1385552/datatype-for-storing-ip-address-in-sql-server),它可以帮助你存储数据。 – BrandonM

+0

范围仅由最后2个八位字节或最后3个字节决定? – objectNotFound

+0

范围由最后2个八比特组决定。 –

回答

1

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

+0

由于IPv4有4个数字最多255个(或FF十六进制),所以最好直接将它们转换为int,这样数字序列就没有间隔了,后面可能会有用 - 因此172.16.1.254为2886730238,并且你可以像数字一样处理所有事情。 –

+0

所以我需要创建一个函数? –

+0

我猜想这样做太多了。我建议在现有表格中添加一列。 –

0
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] 

我不知道你在报告中想要的东西。可能还需要添加一个filkter,但很难说,没有我在我的结尾尝试它。

相关问题