TSQL Вставить в таблицу из 2 таблиц без дубликатов на основе 2 столбцов с приведением даты и времени
Это пример из реальной жизни, пожалуйста, посмотрите на мой sqlfiddle,
У меня есть 3 таблицы, TickData, куда должны быть помещены все данные, и 2 исходные таблицы с данными, которые имеют некоторые перекрывающиеся данные, [ES 09-11_Part01] и [ES 09-11_Part02].
Обратите внимание, что хотя в sqlfiddle я только заполнил 2 таблицы, ES 09-11_Part0X очень небольшим объемом данных, на самом деле я имею дело с более чем 4 миллионами строк в каждой исходной таблице.
Мне нужно вставить строки в TickData из 2 таблиц и нужно избегать дублирования, однако 2 предостережения.
Во-первых, TickData.LastDateTime представляет собой совокупность [ES 09-11_Part0X].LastDate и [ES 09-11_Part0X].LastTime.
Во-вторых, дубликаты идентифицируются только в том случае, если из [ES 09-11_Part0X], CQGTickId и LastDate с LastTime равны TickId и TickData.LastDateTime соответственно, CQGTickId или TickId сами по себе не являются уникальными, их необходимо объединить с полем даты.
Как избежать вставки любых дубликатов в TickData, если запись уже существует в TickData, не вставлять в TickData из исходной таблицы и если в исходной таблице есть дубликаты данных, [ES 09-11_Part0X] ее следует вставлять только один раз в TickData.
В моем sqlfiddle обратите внимание, что [ES 09-11_Part02] имеет 1 запись, которая уже существует в [ES 09-11_Part01]
('2011-04-05','14:12:07.4758734',12267,1,70,12267,12269,163377)
также [ES 09-11_Part02] содержит еще один дубликат в своей собственной таблице, который встречается 3 раза
('2011-04-06','00:47:31.2748398',12272,1,12,12269,12272,194813)
Поэтому окончательный вывод TickData после 2 вставок из исходной таблицы не должен включать строки 6, 9 и 10. Должно существовать только 1 вхождение данных.
Это реальный пример данных по тикам, поэтому он должен быть точным и надежным, пожалуйста. Мне также придется постоянно обновлять TickData дополнительными исходными таблицами, которые могут иметь повторяющиеся и перекрывающиеся значения внутри.
Заранее спасибо всем гениям TSQL.: D
(оригинальная ссылка: http://sqlfiddle.com/)
2 ответа
WITH CTE_TABLE
AS
(SELECT * FROM TABLE1
UNION
SELECT * FROM TABLE 2)
INSERT INTO YOUR_TABLE
SELECT * FROM CTE_TABLE
Попробуйте с этим: http://sqlfiddle.com/
WHERE NOT EXISTS ( SELECT 1 FROM [TickData] t
Where t.LASTDATETIME = cast(p.[LastDate] as datetime) + cast(p.[LastTime] as datetime)
And t.LAST = p.Last
And t.BID = p.Bid
And t.ASK = p.Ask
And t.TICKID = p.CQGTickId )