Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
paft Member Откуда: Сообщений: 15 |
Здравствуйте! Есть база данных на Sql Compact 4.0 с двумя таблицами: TableA: ID bigint NOT NULL, ObjectID uniqueidentifier NOT NULL, Time datetime NOT NULL, ... TableB: ID bigint NOT NULL, ObjectID uniqueidentifier NOT NULL, Time datetime NOT NULL, ... Возникла задача объединения двух таблиц по полям ObjectID и Time: SELECT * FROM TableA A JOIN Table B ON A.ObjectID = B.ObjectID AND A.Time = B.Time WHERE ... Но было обнаружено, что время в разных таблицах может незначительно отличаться. Т.е. при выполнении JOIN таблицы B к таблице A необходимо подобрать запись с таким же ObjectID и наименьшей разницей во времени (допустимая погрешность порядка 300мс). На просторах инета был найден вариант с подзапросом, но он просто вешается на неопределенное время (видимо в связи с огромным количеством записей в обоих таблицах): SELECT * FROM TableA A JOIN TableB B ON B.ID IN ( SELECT TOP 1 ID FROM TableB WHERE ObjectID = A.ObjectID AND Time >= A.Time ) WHERE A.ObjectID = 'b6bea656-b1ff-46c2-be17-dfb13ab5c2a1' AND A.Time >= 06/27/2012 07:50:36'; При чем даже если заменить сравнение по времени с "Time >= A.Time" на "Time = A.Time", запрос все равно виснет. Подскажите, как можно осуществить данное объединение. |
28 июн 12, 10:38 [12787088] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
1. Сдается мне, что из-за отсутствия имени таблицы у поля может происходить неправильный запрос 2. Индексы у ваших таблиц есть ? |
||
28 июн 12, 11:12 [12787361] Ответить | Цитировать Сообщить модератору |
paft Member Откуда: Сообщений: 15 |
В обоих таблицах Primary Key на поле ID и по индексу на полях Time & ObjectID:CREATE INDEX IDX_TableA_ObjectID ON TableA (ObjectID); CREATE INDEX IDX_TableA_Time ON TableA (Time); CREATE INDEX IDX_TableB_ObjectID ON TableB (ObjectID); CREATE INDEX IDX_TableB_Time ON TableB (Time); При этом если в подзапросе конкретизировать таблицу - ничего не меняется: SELECT * FROM TableA A JOIN TableB B ON B.ID IN ( SELECT TOP 1 B2.ID FROM TableB B2 WHERE B2.ObjectID = A.ObjectID AND B2.Time >= A.Time ) WHERE A.ObjectID = 'b6bea656-b1ff-46c2-be17-dfb13ab5c2a1' AND A.Time >= 06/27/2012 07:50:36'; |
28 июн 12, 11:28 [12787499] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |