2016-07-26 17 views
0

Also habe ich zwei Tabellen. Eine Tabelle (tbl1) enthält Informationen zu Subnetzen durch Erstellen, die Spaltennamen sind IP-Adresse, Standort, Server, Gebäude, Start-IP, End-IP und Subnetzmaske.SQL-Abfrage, um Werte aus einer Tabelle anzuzeigen, die zwischen Spaltenwerten in einer anderen Tabelle liegen

Ich habe eine andere Tabelle (TBL2) mit dem Namen Spalt Top-Konsolen-Benutzer, Computernamen, IP-Adresse, Computermodell, Computer-Betriebssystem und Computer-Seriennummer

Ich mag einen Bericht, dass die Listen erstellen die IP-Adressen von tbl2, die in tbl1 zwischen der Start-IP und der End-IP liegen. Wenn zum Beispiel ein Computer von tbl2 eine IP-Adresse 172.16.1.4 hat und tbl1 ein Gebäude hat, dessen Start-IP 172.16.1.1 ist und die End-IP 172.16.1.254 ist, möchte ich das in meinem Bericht sehen können.

Es gibt keine ähnlichen Spalten in beiden Tabellen, so dass die Verwendung einer JOIN-Anweisung nicht wirklich für mich funktioniert hat. Ich verwende auch Parameter (wenn das wichtig ist) in meinem Bericht. Jede Hilfe wäre willkommen.

UPDATE:

Ich weiß, das ist eine Menge, aber es wird mich auf halbem Weg. Ich habe eine Funktion erstellt, die Werte konvertiert, aber nicht sicher ist, wie ich anrufen soll. Noch mehr Zeiger ??

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

Ich bin mir nicht sicher, ob es eine Möglichkeit gibt, eine Reihe von Zahlen wie diese abzufragen (nicht zu 100% sicher). Mein Vorschlag wäre, zu ändern, wie die IP-Adressen in der Tabelle gespeichert werden, um eine solche Abfrage zu ermöglichen. Ich fand [dies] (http://stackoverflow.com/questions/1385552/datatype-for-storing-ip-address-in-sql-server), die in der Lage sein kann, in wie die Daten gespeichert werden. – BrandonM

+0

der Bereich wird nur durch die letzten 2 Oktetts oder letzten 3 entschieden? – objectNotFound

+0

Der Bereich wird durch die letzten 2 Oktetts bestimmt. –

Antwort

1

Ich schlage vor, zuerst die ip Teile zu ihrem entsprechenden vollen Format zu werfen und die Punkte zu entfernen. Konvertieren Sie zum Beispiel 172.16.1.254 zu 172016001254 und dann können die Bereiche leicht verglichen werden, indem Sie einfach eine >= und <= machen. Sie können diese Werte sogar vorher speichern, um diesen Prozess zu beschleunigen. Übrigens sind Joins völlig in Ordnung. verwende einfach die Bedingungen in der on-Klausel.

+0

Da IPv4 4 Zahlen bis zu 255 (oder Hex FF) hat, ist es vielleicht besser, sie direkt in int zu konvertieren, damit es keine Lücken in der Nummernfolge gibt, die später nützlich sein könnten - also 172.16.1.254 ist 2886730238 und Du kannst alles genauso handhaben wie Zahlen. –

+0

also müsste ich eine Funktion erstellen? –

+0

Es wäre zu viel zu tun, denke ich. Ich empfehle, der vorhandenen Tabelle eine Spalte hinzuzufügen. –

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] 

Dies sollte für Sie arbeiten, oder Sie können es auf diese Weise versuchen

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] 

Ich bin nicht sicher, was Sie in den Bericht aufgenommen werden sollen. Es mag noch einen weiteren Filter geben, den du hinzufügen musst, aber schwer zu sagen, ohne dass ich es an meinem Ende ausprobiere.

Verwandte Themen