powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Нумерация по второй таблице.
10 сообщений из 10, страница 1 из 1
Нумерация по второй таблице.
    #38806742
Alex_Wong
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

Есть две таблицы ta и tb :

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
-- DROP TABLE ta;

CREATE TABLE ta
(
  idta serial NOT NULL,
  txt character varying(10),
  isno boolean,
  CONSTRAINT ta_pkey PRIMARY KEY (idta)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE ta
  OWNER TO postgres;

-- DROP TABLE tb;

CREATE TABLE tb
(
  idtb serial NOT NULL,
  mynum smallint,
  txt character varying(10),
  CONSTRAINT tb_pkey PRIMARY KEY (idtb)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE tb
  OWNER TO postgres;


INSERT INTO ta (txt, isno) VALUES ('b1', TRUE);
INSERT INTO ta (txt, isno) VALUES ('b2', TRUE);
INSERT INTO ta (txt, isno) VALUES ('a3', TRUE);
INSERT INTO ta (txt, isno) VALUES ('b2', TRUE);
INSERT INTO ta (txt, isno) VALUES ('c8', TRUE);
INSERT INTO ta (txt, isno) VALUES ('c9', FALSE);
INSERT INTO ta (txt, isno) VALUES ('b7', TRUE);
INSERT INTO ta (txt, isno) VALUES ('k9', TRUE);
INSERT INTO ta (txt, isno) VALUES ('e7', TRUE);
INSERT INTO ta (txt, isno) VALUES ('b7', FALSE);
INSERT INTO ta (txt, isno) VALUES ('a3', TRUE);
---
INSERT INTO tb (mynum, txt) VALUES (5, 'a3');
INSERT INTO tb (mynum, txt) VALUES (1, 'b1');
INSERT INTO tb (mynum, txt) VALUES (4, 'k9');
INSERT INTO tb (mynum, txt) VALUES (2, 'b2');
INSERT INTO tb (mynum, txt) VALUES (3, 'j4');
INSERT INTO tb (txt) VALUES ('c8');
INSERT INTO tb (mynum, txt) VALUES (6, 'm0');
INSERT INTO tb (txt) VALUES ('b7');
INSERT INTO tb (txt) VALUES ('e7');


Хочу получить записи из табл. ta с нумерацией num, коррелировано существующей нумерации mynum в табл. tb, а там, где
в tb.mynum нумерация отсутствует, чтобы пронумеровало в конце по нарастающей.
Т.е. получить вот так :

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
---------------------
num	mynum	txt
---------------------
1	1	 b1

2	2	 b2

3	4	 k9

4	5	 a3

5		 c8

6		 b7

7		 e7
---------------------




Мои попытки :

SELECT mynum, ta.txt FROM ta LEFT JOIN tb ON ta.txt = tb.txt

WHERE tb.txt IN (SELECT ta.txt FROM ta WHERE isno = TRUE GROUP BY ta.txt) ORDER BY mynum;

--
сгруппировать и вставить row_number() OVER() не получается.

Спасибо.
...
Рейтинг: 0 / 0
Нумерация по второй таблице.
    #38806766
Alex_Wong
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex_Wong,

похоже вот так :

Код: plsql
1.
2.
SELECT row_number() OVER(ORDER BY mynum), mynum, ta.txt FROM ta LEFT JOIN tb ON ta.txt = tb.txt 
WHERE tb.txt IN (SELECT ta.txt FROM ta WHERE isno = TRUE GROUP BY ta.txt) GROUP BY tb.mynum, ta.txt;
...
Рейтинг: 0 / 0
Нумерация по второй таблице.
    #38806772
Alex_Wong
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex_Wong,

внутри группировка не нужна :

Код: plsql
1.
2.
   SELECT row_number() OVER(ORDER BY mynum), mynum, ta.txt FROM ta LEFT JOIN tb ON ta.txt = tb.txt 
   WHERE tb.txt IN (SELECT ta.txt FROM ta WHERE isno = TRUE) GROUP BY tb.mynum, ta.txt;
...
Рейтинг: 0 / 0
Нумерация по второй таблице.
    #38806795
Alex_Wong
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex_Wong,

читал, что IN - затратная операция, но уйти от нее не получилось.
...
Рейтинг: 0 / 0
Нумерация по второй таблице.
    #38806839
Alex_Wong,

IN эквивалентно заменяем на EXISTS, а при небольшом шаманстве и на [lateral] JOIN
...
Рейтинг: 0 / 0
Нумерация по второй таблице.
    #38806842
Alex_Wong
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - Эх,

шаманство не получилось ...
...
Рейтинг: 0 / 0
Нумерация по второй таблице.
    #38806849
Alex_Wong
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - Эх,

точнее, не получилось ни с EXISTS, ни с JOIN
...
Рейтинг: 0 / 0
Нумерация по второй таблице.
    #38806866
Alex_Wong
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - Эх,

Вот при таком запросе :

Код: plsql
1.
2.
SELECT row_number() OVER(ORDER BY mynum)as num, mynum, ta.txt FROM ta LEFT JOIN tb ON ta.txt = tb.txt 
WHERE EXISTS (SELECT ta.txt FROM ta WHERE isno = TRUE) GROUP BY tb.mynum, ta.txt;



получаю лишнюю строку -- не отсеялась c9 по FALSE

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
1   1   b1
2   2   b2
3   4   k9
4   5   a3
5       b7
6       c9  <--
7       c8
8       e7
...
Рейтинг: 0 / 0
Нумерация по второй таблице.
    #38806878
в exists-подзапросе как минимум не хватает условия связи между внешней и внутренней таблицами...
Alex_WongДобрый Э - Эх,

Вот при таком запросе :

Код: plsql
1.
2.
SELECT row_number() OVER(ORDER BY mynum)as num, mynum, ta.txt FROM ta LEFT JOIN tb ON ta.txt = tb.txt 
WHERE EXISTS (SELECT null FROM ta WHERE isno = TRUE and ta.txt = tb.txt) GROUP BY tb.mynum, ta.txt;



получаю лишнюю строку -- не отсеялась c9 по FALSE
...
Рейтинг: 0 / 0
Нумерация по второй таблице.
    #38806882
Alex_Wong
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - Эх,

да, спасибо, так работает.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Нумерация по второй таблице.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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