Alexander Drankin: я не отрицаю возможности использования курсоров. но с точки зрения перфоманса курсоры - зло.
на счет больших объемов данных - все надо смотреть по месту.
Евгений:
computed_result() - просто так, т.к. результат второго запроса вычисляется от значения первого.
select * from t1 where date in (select date from t2);
тут могут быть проблемы с производительностью, если для каждой строки t1 будут вычисляться даты из t2
Алексей Семенов:
а вы попробуйте, смотрите план.
глядишь вместо "другой чуть больше" будет всего пара минут...
SELECT name
FROM sysobjects so JOIN sysconstraints sc ON so.id = sc.constid
WHERE object_name(so.parent_obj) = 'CONTENT_TFS' AND so.xtype = 'PK'
-- AND sc.colid = 0
для чего join на sysconstraints в данном случае?. поиск все равно по таблице sysobjects
в условии корректней все же вычислять константу, нежели делать модификацию значений колонки.
в данном случае не страшно, но для больших таблиц так не стоит делать, учше все же
parent_obj = OBJECT_ID('CONTENT_TFS')
скуль один раз вычисляет OBJECT_ID('CONTENT_TFS') и дальше будет использовать сик на нужные записи.
в случае object_name(so.parent_obj) - он будет для каждой строки таблицы вычислять значение...
если добавить/удалить столбцы, то не только триггера переделывать.
ну если очень хочется, то можно сделать все на динамике, т.е. универсальный триггер на любую таблицу ))
получить список колонок и в курсоре + динамика
список колонок для таблицы:
SELECT QUOTENAME (SC.name) FROM sys.columns SC
JOIN sys.tables ST ON SC.[object_id] = ST.[object_id]
WHERE ST.name = 'test'
Семён Семёнов:
вам лучше знать может ли за дату 2008-02-04 быть два значения item_code ?!
еслу будет два.. то без доп группировки получится что то типа этого:
year = 2008 / start = 2008-02-04 / end = 2008-09-04 / item_s = 11 / item_e = 14
year = 2008 / start = 2008-02-04 / end = 2008-09-04 / item_s = 12 / item_e = 14
вот пример на MS SQL
думаю на постгресе аналогично, немного синтаксис подправить:
SELECT year_D, min_D, max_D, MIN(s.maincode), MIN(s2.maincode)
FROM (
select datepart(year,edit_dat) as year_D, min(edit_dat) as min_D, max(edit_dat) as max_D
from spr
group by datepart(year,edit_dat)
) G
LEFT JOIN spr s ON s.edit_dat = G.min_D
LEFT JOIN spr s2 ON s2.edit_dat = G.max_D
GROUP BY year_D, min_D, max_D
Вторая группировка только для того, что в одну мин или макс дату может быть несколько кодов или что там..
а можете написать запрос для SQL Server 2012 (2014,2008R2) c использованием limit
вот очень интересно.
вроде его нет у ms sql )