powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / запись с минимальным значением не уникального столбца
1 сообщений из 1, страница 1 из 1
запись с минимальным значением не уникального столбца
    #32786598
Black Jaguar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть таблицы
CREATE TABLE bgps(
bgpid SERIAL,
name VARCHAR(32) NOT NULL,
rate INTEGER DEFAULT 100,
CONSTRAINT PK_bgps_bgpid PRIMARY KEY (bgpid),
CONSTRAINT TC_bgps_name UNIQUE (name)
);

CREATE TABLE bgp_nets(
bgpnid SERIAL,
bgpid INTEGER,
net INET NOT NULL,
active BOOLEAN,
CONSTRAINT PK_bgp_nets_bgpnid PRIMARY KEY (bgpnid),
CONSTRAINT FK_bgp_net_bgpid FOREIGN KEY (bgpid) REFERENCES bgps(bgpid) ON DELETE CASCADE ON UPDATE CASCADE
);

и отображение
CREATE VIEW bgp_nets_rate
(bgpnid,bgpid,net,active,rate)
AS
SELECT bgp_nets.bgpnid, bgp_nets.bgpid, bgp_nets.net, bgp_nets.active, bgps.rate
FROM (bgp_nets JOIN bgps ON ((bgps.bgpid = bgp_nets.bgpid)));

В таблице bgp_nets хранятся записи вида
Код: plaintext
1.
2.
3.
4.
 bgpnid | bgpid |       net       | active
--------+-------+-----------------+--------
       1  |      1  |  195 . 68 . 222 . 0 / 23  | t
       2  |      4  |  0 . 0 . 0 . 0 / 0        | t
соответственно в bgp_nets_rate
Код: plaintext
1.
2.
3.
4.
 bgpnid | bgpid |      net       | active | rate
--------+-------+----------------+--------+------
       1  |      1  |  195 . 68 . 222 . 0 / 23  | t      |   500 
       2  |      4  |  0 . 0 . 0 . 0 / 0        | t      |  1000 
Запрос вида SELECT * FROM bgp_nets_rate WHERE '195.68.222.22'::inet<<net
возвращает 2 строки. (т.к. 195.68.222.22 входит в обе сети)

В задаче необходимо получить идентификаторы сети (bgpid) отправителя и получателя т.е. если пакет прошел с 195.68.222.22 на 195.68.222.28 это должеы быть соответственно 1 и 1.
Запрос вида
SELECT srct.bgpid AS src, dstt.bgpid AS dst
FROM (
SELECT bgpid FROM bgp_nets_rate WHERE '195.68.222.22'::inet<<net AND active=TRUE ORDER BY rate LIMIT 1
) as srct
CROSS JOIN(
SELECT bgpid FROM bgp_nets_rate WHERE '195.68.222.28'::inet<<net AND active=TRUE ORDER BY rate LIMIT 1
) as dstt
решает проблему, однако по причине того, что этот код критичен к производительности хотелось бы получить мнения относительно возможности усовершенствования данного запроса...
...
Рейтинг: 0 / 0
1 сообщений из 1, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / запись с минимальным значением не уникального столбца
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]