2013-06-25 3 views
1

У меня есть две таблицы в следующей структуреРегистрация содержимое поля и вставить новую запись

Таблица - MemoType

ID | MemoTypeID | MemoTypeName 
1  1234   A 
2  5678   B 

стол - Memos

ID | MemoTypeID | Memo  | ExtRef 
1 1234   TextOne XYZ 
2 5678   TextTwo XYZ 
3 1234   TextThree TUV 

Мы хотели бы обновить эти таблицы для отражения следующих данных

Таблица - MemoType

ID | MemoTypeID | MemoTypeName 
3  9999   NewCombinedMemo 

Стол - Memos

ID | MemoTypeID | Memo     | ExtRef 
4 9999   <A> TextOne <B> TextTwo XYZ 
5 9999   <A> TextThree    TUV 

В таблице записки имеет около 2 млн строк с около 200000 уникальных значений для ExtRef.

Мое мышление состоит из следующих строк (с использованием .NET): заполнить List всех уникальных значений ExtRef от Memos table; Для каждого уникального ExtRef получите список всех значений Memo; при необходимости присоединить строки; вставить новую запись для каждого ExtRef; удалите остальные записи для каждого ExtRef. Проблема в том, что это приведет к большому количеству операций sql.

Просьба предложить, если есть другие эффективные стратегии для достижения этого непосредственно в SQL.

+0

Вместо того, чтобы получать подсветку уникального 'ExtRef' и затем искать строки для этого, сделайте' GroupBy (x => x.ExtRef) '. –

ответ

1

Это действительно возможно непосредственно через SQL, следующее создает переменные таблицы для демонстрации/тестирования с образцами данных и не удаляет исходные данные.

Оригинальные данные могут быть легко удалены, используя условие, проверяющее идентификатор типа memo, но я бы хотел отложить это до тех пор, пока не выполнил ручную проверку на такой большой таблице!

-- setting the scene 
DECLARE @MemoType TABLE 
(
    Id int, 
    MemoTypeId int, 
    MemoTypeName varchar(30) 
) 

DECLARE @Memo TABLE 
(
    Id int identity(1,1), 
    MemoTypeId int, 
    Memo varchar(500), 
    ExtRef varchar(1000) 
) 

INSERT INTO @MemoType VALUES (1,1234,'A'); 
INSERT INTO @MemoType VALUES (2,1234,'B'); 
INSERT INTO @MemoType VALUES (3,9999,'NewCombinedMemo'); 

INSERT INTO @Memo VALUES (1234, 'TextOne', 'XYZ'); 
INSERT INTO @Memo VALUES (5678, 'TextTwo', 'XYZ'); 
INSERT INTO @Memo VALUES (1234, 'TextThree', 'TUV'); 



WITH cte(id, memotype, memotext, ref) as (
    SELECT Id, MemoTypeId, Memo, ExtRef FROM @Memo 
) 
INSERT INTO @memo 
SELECT 9999, stuff(memos,1,1,''),ref 
FROM cte [outer] 
CROSS APPLY (
    SELECT ',' + memotext 
    FROM cte [inner] 
    WHERE [outer].ref = [inner].ref 
    FOR XML PATH('') 
) n(memos) 
GROUP BY ref, memos 

select * from @memo 

СТЕ логик/описание было заимствовано из string concatenate in group by function with other aggregate functions - добавление в логике вставлять и вырезать ведущую запятую.

  • Я разместил ваш исходный запрос в CTE.
  • Затем я перекрещиваюсь с подзапросом, который получает набор заметок с разделителями-запятыми для каждой ссылки во внешнем запросе.
  • Поскольку я также выбрал колонку заметок, мне также пришлось группировать столбец примечаний .
  • Начальная запятая должна быть удалена с помощью функции материала
  • И, наконец, результат вставляется.
Смежные вопросы