Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 MS SQL Compact & JOIN по приблизительно равным полям  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL Compact & JOIN по приблизительно равным полям  [new]
Glory
Member

Откуда:
Сообщений: 104751
paft
AND Time >= A.Time

1. Сдается мне, что из-за отсутствия имени таблицы у поля может происходить неправильный запрос
2. Индексы у ваших таблиц есть ?
28 июн 12, 11:12    [12787361]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL Compact & JOIN по приблизительно равным полям  [new]
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 Ответить