Обновите таблицу SQL своими собственными строками с помощью PostgreSQL - PullRequest
0 голосов
/ 16 февраля 2010

Я хочу попробовать обновить таблицу postgresql своими собственными значениями.

Эта таблица содержит обзор продуктов, проданных по годам и месяцам.

CREATE TABLE sales
(
  sector character(3),
  brand character(4),
  product character(16),
  syear integer,
  smonth integer,
  units_sold integer,
  units_sold_year integer,
  CONSTRAINT pk_sales_id PRIMARY KEY (sector, brand, product, syear, smonth)
);

INSERT INTO sales(sector, brand, product, syear, smonth, units_sold, units_sold_year) VALUES ('1', 'ABE', '71012', 2010, 0, 9, 0); /* The month 0 is the whole year */
INSERT INTO sales(sector, brand, product, syear, smonth, units_sold, units_sold_year) VALUES ('1', 'ABE', '71012', 2010, 1, 4, 0);
INSERT INTO sales(sector, brand, product, syear, smonth, units_sold, units_sold_year) VALUES ('1', 'ABE', '71012', 2010, 2, 5, 0);
INSERT INTO sales(sector, brand, product, syear, smonth, units_sold, units_sold_year) VALUES ('ALL', 'ABE', '71012', 2010, 0, 9, 10);
...

Я добавил столбец «units_sold_year», потому что мне нужно иметь возможность делать очень быстрые запросы к этой таблице (в противном случае мне пришлось бы делать подзапросы), и я пытаюсь заполнить его.

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

UPDATE sales set units_sold_year = (SELECT units_sold_year FROM sales as s WHERE sector = 'ALL' and s.smonth = 0 and s.brand = su.brand and s.product = su.product and s.syear = su.syear)
FROM sales su
where su.syear = 2010
and su.brand = 'ABE' and su.product = '71012';

Можно ли обновить таблицу с ее собственными строками, как это?

Ответы [ 2 ]

2 голосов
/ 16 февраля 2010

Ваш запрос выглядит хорошо (даже если я не согласен с требованием)

Я бы изменил порядок вашего подзапроса, чтобы он соответствовал вашему индексу PRIMARY KEY. Я считаю, что с составным индексом, подобным тому, который у вас есть, Postgres будет оценивать в порядке индекса.

Итак, ваш индекс PK равен :

(сектор, марка, продукт, год, smonth)

и Ваш подзапрос должен быть:

... ГДЕ сектор = "ВСЕ" и s.brand = su.brand и s.product = su.product и s.syear = su.syear и s.smonth = 0 ...

С составными индексами порядок имеет значение для запросов.

Если у вас есть составной индекс по столбцам (col0, col1, col2), этот индекс будет полезен для запросов, которые:

select * from tablex where col0 = a
select * from tablex where col0 = a and col1 = b
select * from tablex where col0 = a and col1 = b and col2 = c

но он не будет использоваться для запроса, который:

select * from tablex where col1=b and col2=c

Таким образом, было бы излишним (и, вероятно, снижающим производительность) создавать индексы для (col0), (col0, col1) и (col0, col1, col2).

0 голосов
/ 17 февраля 2010

Остальные ответы великолепны, но я заметил одну вещь: вы используете char (n). Как правило, это плохой тип данных для использования, потому что он накладывается. Попробуйте вместо этого использовать varchar.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...