2016-07-26 75 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,但很難說,沒有我在我的結尾嘗試它。