Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Обход подзапроса в аггрегирующей функции  [new]
telz
Member

Откуда:
Сообщений: 54
Есть запрос:
SELECT 
	(SELECT COUNT(*)  
		FROM sys.computed_columns cc2
		WHERE NOT (cc2.[name] = c.[name]) AND
			UPPER(REPLACE(cc2.[definition], cc2.[name], '')) LIKE '%' + UPPER(c.[name]) + '%') AS SortOrder,
	t.[name] AS TableName
	FROM sys.columns c
	JOIN sys.tables t ON c.[object_id] = t.[object_id]
	WHERE NOT t.[name] = N'sysdiagrams'
	ORDER BY SortOrder DESC;
Все отлично работает, но есть необходимость сгруппировать все по TableName.
Изменяю запрос:
SELECT 
	SUM((SELECT COUNT(*)  
		FROM sys.computed_columns cc2
		WHERE NOT (cc2.[name] = c.[name]) AND
			UPPER(REPLACE(cc2.[definition], cc2.[name], '')) LIKE '%' + UPPER(c.[name]) + '%')) AS SortOrder,
	t.[name] AS TableName
	FROM sys.columns c
	JOIN sys.tables t ON c.[object_id] = t.[object_id]
	WHERE NOT t.[name] = N'sysdiagrams'
	GROUP BY t.[name]
	ORDER BY SortOrder DESC;
И, естественно, получаю ошибку:
Cannot perform an aggregate function on an expression containing an aggregate or a subquery.
Что-то ума не приложу, как это можно обойти...
Как вариант использовать временную таблицу, а уж потом из нее делать выборку с суммированием... Но этот вариант мне не нравится, может быть есть значительно лучше?
Спасибо!
7 авг 09, 12:02    [7510134]     Ответить | Цитировать Сообщить модератору
 Re: Обход подзапроса в аггрегирующей функции  [new]
Glory
Member

Откуда:
Сообщений: 104760
telz
Есть запрос:

И что он пытается вычислить ?
7 авг 09, 12:04    [7510153]     Ответить | Цитировать Сообщить модератору
 Re: Обход подзапроса в аггрегирующей функции  [new]
telz
Member

Откуда:
Сообщений: 54
Glory,
Сортировка таблиц на в базе с учетом вычисляемых колонок - если к-то колонка к-то таблицы используется в вычисляемой колонке другой, то первая таблица выводится выше второй.
7 авг 09, 12:06    [7510167]     Ответить | Цитировать Сообщить модератору
 Re: Обход подзапроса в аггрегирующей функции  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
telz,

CTE или derived table
7 авг 09, 12:11    [7510205]     Ответить | Цитировать Сообщить модератору
 Re: Обход подзапроса в аггрегирующей функции  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
iap
telz,

CTE или derived table
В подробности запроса не вдавался.
Может, его вообще можно написать на порядок проще.
7 авг 09, 12:12    [7510222]     Ответить | Цитировать Сообщить модератору
 Re: Обход подзапроса в аггрегирующей функции  [new]
Glory
Member

Откуда:
Сообщений: 104760
telz
Glory,
Сортировка таблиц на в базе с учетом вычисляемых колонок - если к-то колонка к-то таблицы используется в вычисляемой колонке другой, то первая таблица выводится выше второй.

Если таблиц, то зачем в основном запросе FROM sys.columns c JOIN sys.tables ?
7 авг 09, 12:14    [7510240]     Ответить | Цитировать Сообщить модератору
 Re: Обход подзапроса в аггрегирующей функции  [new]
telz
Member

Откуда:
Сообщений: 54
Чтобы проанализировать использование колонок в вычисляемых колонках
7 авг 09, 12:29    [7510351]     Ответить | Цитировать Сообщить модератору
 Re: Обход подзапроса в аггрегирующей функции  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
SELECT SUM(SortOrder) SortOrder, TableName from (
SELECT 
	(SELECT COUNT(*)  
		FROM sys.computed_columns cc2
		WHERE NOT (cc2.[name] = c.[name]) AND
			UPPER(REPLACE(cc2.[definition], cc2.[name], '')) LIKE '%' + UPPER(c.[name]) + '%') AS SortOrder,
	t.[name] AS TableName
	FROM sys.columns c
	JOIN sys.tables t ON c.[object_id] = t.[object_id]
	WHERE NOT t.[name] = N'sysdiagrams'
	) zapros
 group by TableName
ORDER BY SortOrder DESC

для спящего время бодрствования равносильно сну
7 авг 09, 12:30    [7510358]     Ответить | Цитировать Сообщить модератору
 Re: Обход подзапроса в аггрегирующей функции  [new]
Glory
Member

Откуда:
Сообщений: 104760
telz
Чтобы проанализировать использование колонок в вычисляемых колонках

Зачем sys.columns c в основном запросе, а не в подзапросе, раз вам всего лишь надо упорядочить таблицы ?
7 авг 09, 12:32    [7510373]     Ответить | Цитировать Сообщить модератору
 Re: Обход подзапроса в аггрегирующей функции  [new]
telz
Member

Откуда:
Сообщений: 54
Алексей2003,
Спасибо! Сейчас попробую

Glory, так для каждой колонки проанализировать все вычисляемые колонки... Можно и в подзапрос запихать, но не вижу смысла...
7 авг 09, 12:34    [7510400]     Ответить | Цитировать Сообщить модератору
 Re: Обход подзапроса в аггрегирующей функции  [new]
Glory
Member

Откуда:
Сообщений: 104760
telz


Glory, так для каждой колонки проанализировать все вычисляемые колонки... Можно и в подзапрос запихать, но не вижу смысла...

Мда, не вижу смысла. А зачем вы тогда делаете GROUP BY t.[name], если не видите смысла ?
Не делаейте его и не нужно будет ничего обходить.
7 авг 09, 12:42    [7510493]     Ответить | Цитировать Сообщить модератору
 Re: Обход подзапроса в аггрегирующей функции  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
telz
Glory,
Сортировка таблиц на в базе с учетом вычисляемых колонок - если к-то колонка к-то таблицы используется в вычисляемой колонке другой, то первая таблица выводится выше второй.
А в выражении вычисляемой колонки можно обращаться к колонке другой таблицы?
7 авг 09, 12:46    [7510542]     Ответить | Цитировать Сообщить модератору
 Re: Обход подзапроса в аггрегирующей функции  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
2telz
на самом деле этот запрос можно выполнить без подзапросов в SELECT. что ускорит его работу.
через джоин.

для спящего время бодрствования равносильно сну
7 авг 09, 12:48    [7510568]     Ответить | Цитировать Сообщить модератору
 Re: Обход подзапроса в аггрегирующей функции  [new]
telz
Member

Откуда:
Сообщений: 54
Все, я понял, что ерунду написал... Ну расскажите тогда, как лучше получить тот же результат?
7 авг 09, 12:51    [7510612]     Ответить | Цитировать Сообщить модератору
 Re: Обход подзапроса в аггрегирующей функции  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
select count(*), st.[name] AS TableName
 from sys.columns sc
  join sys.computed_columns scc
   on sc.name <> scc.name and UPPER(REPLACE(cc2.[definition], cc2.[name], '')) LIKE '%' + UPPER(c.[name]) + '%'
  JOIN sys.tables st ON c.[object_id] = t.[object_id]
 group by st.[name]
 order by 1
както так.

для спящего время бодрствования равносильно сну
7 авг 09, 13:10    [7510786]     Ответить | Цитировать Сообщить модератору
 Re: Обход подзапроса в аггрегирующей функции  [new]
telz
Member

Откуда:
Сообщений: 54
Спасибо!
7 авг 09, 13:16    [7510829]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить