2016-04-19 20 views
0

ich habe und Oracle 11g-Datenbank mit den folgenden drei Tabellen (vereinfacht):mehr Spalten auswählen, basierend auf dem max einer anderen Spalte

IP-Tabelle, eine IP-Kennung enthält, die IP und IP-Status und ein FQDN. IPs könnten wiederholt werden.

+-------+-------------+-----------+-----------+ 
| ID_IP |  IP  | IP_STATUS | FQDN | 
+-------+-------------+-----------+-----------+ 
|  1 | 192.168.1.1 |   1 | test.com | 
|  2 | 192.168.1.1 |   2 | test.com | 
|  3 | 192.168.1.1 |   3 | test.com | 
|  4 | 10.10.45.12 |   2 | test2.com | 
+-------+-------------+-----------+-----------+ 

VLAN-Tabelle, enthält, und die VLAN-Kennung und die VLAN-Nummer

+---------+-------------+ 
| VLAN_ID | VLAN_NUMBER | 
+---------+-------------+ 
|  1 |   3 | 
|  2 |   5 | 
|  3 |   7 | 
+---------+-------------+ 

A Tabelle VLANs und IPs Korrelieren:

+-------+---------+ 
| IP_ID | VLAN_ID | 
+-------+---------+ 
|  1 |  1 | 
|  2 |  2 | 
|  3 |  3 | 
|  4 |  2 | 
+-------+---------+ 

In der tatsächlichen IP-Tabelle, der Primärschlüssel ist die Tupel (IP, IP_STATUS). Mein Ziel ist es, eine neue Tabelle zu erstellen, die IP_STATUS eliminiert, und dazu möchte ich IPs aggregieren und ID_IP und FQDN der IP erhalten, deren VLAN_NUMBER höher ist. Die Antwort für die SELECT-Abfrage würde wie folgt sein:

+-------+-------------+-----------+ 
| ID_IP |  IP  | FQDN | 
+-------+-------------+-----------+ 
|  3 | 192.168.1.1 | test.com | 
|  4 | 10.10.45.12 | test2.com | 
+-------+-------------+-----------+ 

ich die IP bekommen kann die folgende Abfrage verwenden:

SELECT i.IP, max(v.VLAN_ID) 
FROM IPS i 
LEFT JOIN VLAN_IP_REL v_i ON i.ID_IP=v_i.ID_IP 
LEFT JOIN VLANS v ON v_i.ID_VLAN=v.ID_INSTANCIA 
GROUP BY i.IP; 

Was ich nicht weiß, ist, wie die anderen Spalten zu erhalten. Ich habe versucht, mit einer Unterabfrage wie folgt aus:

SELECT i.ID_IP, i.IP, i.FQDN 
FROM IPS i 
WHERE i.IP IN (
    SELECT i.IP, max(v.VLAN_ID) 
    FROM IPS i 
    LEFT JOIN VLAN_IP_REL v_i ON i.ID_IP=v_i.ID_IP 
    LEFT JOIN VLANS v ON v_i.ID_VLAN=v.ID_INSTANCIA 
    GROUP BY i.IP; 
) 

Aber es funktioniert nicht, da die Unterabfrage zwei Werte zurückgibt, und ich brauche die max (vlan.VLAN_ID) die Aggregation zu tun.

Wie konnte ich die richtige IP_ID bekommen?

Vielen Dank!

Antwort

2

Sie können eine analytische Klausel von IP und Reihenfolge von VLAN_NUMBER aufzuspalten, dann filtern, dass nur die erste Zeile in jeder Gruppe zu behalten:

SELECT ID_IP, IP, FQDN 
FROM (
    SELECT ROW_NUMBER() OVER (PARTITION BY i.IP ORDER BY v.VLAN_NUMBER DESC) AS NB, 
    i.ID_IP, i.IP, i.FQDN 
    FROM IPS i 
    LEFT JOIN VLAN_IP_REL v_i ON i.ID_IP = v_i.ID_IP 
    LEFT JOIN VLANS v ON v_i.VLAN_ID = v.VLAN_ID 
) t_a 
WHERE NB = 1 
+0

Genau das, was ich wollte, danke! – Cea33

0

Sie können versuchen MIT Klausel. Ungefähr ...

WITH IPWITHMAXVLANID(IP, MAXVLAN) AS (
    SELECT i.IP, max(v.VLAN_ID) 
    FROM IPS i 
    LEFT JOIN VLAN_IP_REL v_i ON i.ID_IP=v_i.ID_IP 
    LEFT JOIN VLANS v ON v_i.ID_VLAN=v.ID_INSTANCIA 
    GROUP BY i.IP 
) 
SELECT i.ID_IP, i.IP, i.FQDN, iml.MAXVLAN 
FROM IPS i 
INNER JOIN IPWITHMAXVLANID iml on i.IP = imp.IP 

Hoffe, dass dies hilft.

Verwandte Themen