Вот как я бы подойти к такой задаче.
Шаг 1. Имейте функцию/метод для объединения значений в нескольких столбцах в один столбец. В вашем случае мы хотим поставить два значения STAT_ID
и STAT_VALUE
вместе. В этом случае достаточно простого преобразования в строку и конкатенацию.Таким образом, строка с двумя колоннами:
STAT_ID STAT_VALUE
12 100
становится строку с одной колонки:
single_value
12_100
Результат этого преобразования должен быть таблица, как это:
ITEM_ID single_value
1 12_100
1 13_500
2 12_200
2 14_300
3 12_100
3 13_500
4 12_100
Шаг 2 . Есть функция Aggregate, которая принимает значения в нескольких строках и возвращает одно значение в виде длинной конкатенированной строки. Это может быть функция CLR, функция T-SQL или конструкция FOR XML
. Вы можете выбрать один из них в зависимости от того, что поддерживает SQL Server CE.
Результат этого преобразования должен быть таблица, как это:
ITEM_ID aggregated_single_value
1 12_100__13_500
2 12_200__14_300
3 12_100__13_500
4 12_100
Шаг 3. После того как вы этот результат вы можете просто GROUP BY aggregated_single_value
и COUNT
сколько ITEM_IDs
с точно таким же набором значений у вас есть. Затем вернитесь только те ITEM_IDs
, которые HAVING
насчитать более 1.
aggregated_single_value Count
12_100__13_500 2
12_200__14_300 1
12_100 1
Edit
Общий подход по-прежнему выполняется с ограничениями SQL Server CE.
- У него нет общих выражений-таблиц - используйте явные временные таблицы для каждого шага.
- У него нет
FOR XML
, определенные пользователем функции, CLR - выполнить агрегацию «вручную». Похоже на это supports cursors. Откройте курсор - сканируйте таблицу один раз с правильным порядком, суммируйте значения и сохраните их во временную таблицу.
- Поддерживает ли он такие крупные типы, как
varbinary(max)
или varchar(max)
? Если да - отлично, если нет - вы будете ограничены varchar(8000)
или varbinary(8000)
. Если в таблице STATS
имеется не более двух (или так) строк для одного и того же ITEM_ID
, то достаточно 8000 байт.
Также существует, по крайней мере, один простой грубый способ ограничить количество строк, обработанных курсором. Сначала сделайте простой подсчет строк для каждого ITEM_ID
в таблице STATS
и оставьте только те IDs
, которые имеют соответствующий счет. Другими словами, отфильтруйте очевидные несоответствия. Этот шаг устранит ID=4
из вашего примера.
Являются ли эти столбцы NULLable? – dnoeth
Как вы используете 'INTERSECT' для этих результатов? ;). –
Что делать, если есть строка '5 13 500', если она будет включена в результат или только если есть' 5 12 100'? – dnoeth