2016-04-19 5 views
0

у меня есть и базы данных 11g Oracle со следующими тремя таблицами (упрощенно):Выберите несколько столбцов на основе макс другого столбца

IP Table, содержащий идентификатор IP, то IP, и статус IP и FQDN. 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 | 
+---------+-------------+ 

A Таблица соотнесения виртуальных локальных сетей и IP-адреса:

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

В реальной таблице IP, первичный ключ является кортеж (IP, IP_STATUS). Моя цель - создать новую таблицу, исключающую IP_STATUS, и для этого я хочу агрегировать IP-адреса и получить ID_IP и FQDN IP-адреса, значение VLAN_NUMBER выше. Ответ на запрос SELECT, будет что-то вроде этого:

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

я могу получить IP-адрес с помощью следующего запроса:

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

Но это не работает, так как подзапрос возвращает два значения, и мне нужен максимум (vlan.VLAN_ID), чтобы сделать агрегацию.

Как я могу получить IP_ID?

Спасибо!

ответ

2

Вы можете использовать аналитическую статью для разделения по IP и порядке VLAN_NUMBER, затем процеживают, чтобы сохранить только первую строку в каждой группе:

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 

Надеюсь, это поможет.

Смежные вопросы