2016-04-19 6 views
0

の最大に基づいて複数の列を選択:IP識別子、IP、およびIPステータスとFQDNを含む、私は、次の3つのテーブル(簡体字)と11gデータベースがあり、Oracleの別の列

IPテーブルを。 IPが繰り返される可能性があります。

+-------+-------------+-----------+-----------+ 
| 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テーブル、を含むとVLAN識別子とVLAN番号

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

VLANとIPアドレスを関連付けるテーブル:実際のIP表中

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

、主キーでありますタプル(IP、IP_STATUS)。私の目標は、IP_STATUSを排除した新しいテーブルを作成することです。そのために、IPを集約し、VLAN_NUMBERが高いIPのID_IPとFQDNを取得したいと考えています。私は次のクエリを使用してIPを取得することができます

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

:SELECTクエリの答えは、このようなものになるだろう

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 
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; 
) 

しかし、サブクエリが2つの値を返し、私は集約を行うには、最大(vlan.VLAN_IDを)必要があるので、それは、動作しません。

どうすれば適切なIP_IDを取得できますか?

ありがとうございました!

答えて

2

その後、各グループ内の最初の行のみを保持するためにフィルタリングし、VLAN_NUMBERによってIPと順序によって分割するための分析句を使用することができます。

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

私が望んでいたまさに、ありがとうございました! – Cea33

0

節を試してみるとよいでしょう。おおよそ...

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 

関連する問題