Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Нумерация по второй таблице. / 10 сообщений из 10, страница 1 из 1
14.11.2014, 17:31:11
    #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
14.11.2014, 18:01:21
    #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
14.11.2014, 18:10:58
    #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
14.11.2014, 18:38:42
    #38806795
Alex_Wong
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нумерация по второй таблице.
Alex_Wong,

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

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

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

точнее, не получилось ни с EXISTS, ни с JOIN
...
Рейтинг: 0 / 0
14.11.2014, 20:53:19
    #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
14.11.2014, 21:30:21
    #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
14.11.2014, 21:41:17
    #38806882
Alex_Wong
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нумерация по второй таблице.
Добрый Э - Эх,

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


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