#sql #sql-server
#sql #sql-сервер
Вопрос:
Пожалуйста, смотрите Запрос ниже:
select thisdate,created from dbusns d
INNER JOIN (SELECT MAX(created) created,
C.reference
FROM dbusns
INNER JOIN [server].CUSTODYDB.DBO.dbcustody C
ON dbusnS.urns = C.reference
WHERE dbusns.datasetname = 'CUSTODY'
GROUP BY C.reference) T on D.urns = T.reference
WHERE D.urns = '1'
Это возвращает: 2008-10-31 00:00:00.000, 2008-11-01 00:00:00.000
Затем я запускаю запрос ниже:
UPDATE D
SET thisdate = T.created
FROM dbusns D
INNER JOIN (SELECT MAX(created) created,
C.reference
FROM dbusns
INNER JOIN [server].CUSTODYDB.DBO.dbcustody C
ON dbusnS.urns = C.reference
WHERE dbusns.datasetname = 'CUSTODY'
GROUP BY C.reference) T on D.urns = T.reference
WHERE D.urns = '1'
Затем я запускаю приведенный ниже запрос, который возвращает: 2008-10-31 00:00:00.000 (должно быть: 2008-11-01 00:00:00.000)
select THISDATE from dbusns where datasetname='CUSTODY' AND URNS='1'
Created и ThisDate — это datetimes . Если я уменьшу количество записей в dbcustody до 29 598, значение будет обновляться правильно. Я попытался удалить 29 598-ю запись, но это не сработало.
Что происходит? Похоже, что план выполнения неверен, поскольку отправляемый им удаленный запрос:
SELECT TOP 1 created FROM dbcustody where reference='1'
Почему не отправляется оператор MAX / ORDER ПО созданному desc?
Комментарии:
1. Оба сервера используют одну и ту же сортировку и являются
dbcustody
busns
таблицами и или один / оба из них являются представлением?2. @Dommer, они оба являются одним и тем же сервером. Они оба имеют одинаковую сортировку.
3. Если это один и тот же сервер, почему вы используете запрос из четырех частей? Я в замешательстве. Или вы имеете в виду, что они используют одну и ту же версию SQL? Но как насчет сопоставления каждой базы данных? И является ли это представлением, а не таблицей?
4. @Dommer, извините, они находятся на разных серверах. Обе таблицы, одинаковые параметры сортировки.
5. Круто, хорошо, а как насчет того, чтобы попробовать
OPENQUERY
вместо этого? Я отредактирую свой ответ на примере…
Ответ №1:
РЕДАКТИРОВАТЬ: удалены некоторые ненужные вещи.
Когда это случалось со мной в прошлом, я обычно прибегал к OPENQUERY, который, как правило, решает проблему. Попробуйте это:
UPDATE D
SET thisdate = T.created
FROM dbusns D
INNER JOIN (SELECT MaxCreated, Reference FROM OPENQUERY(server, 'SELECT MAX(created) MaxCreated, reference
FROM CUSTODYDB.DBO.dbcustody') as RemoteTable
INNER JOIN dbusns ON dbusnS.urns = RemoteTable.reference
WHERE dbusns.datasetname = 'CUSTODY'
GROUP BY RemoteTable.reference) T ON D.urns = T.reference
WHERE D.urns = '1'
Комментарии:
1. Спасибо. Я получаю: 2008-10-31 00:00:00.000 2008-11-01 00:00:00.000 когда я выполню ваш запрос выше. Неправильный план выполнения (см. Удаленный запрос в моем OP — последнем операторе SQL).
2. Да, я думаю, что неправильно истолковал исходный вопрос. Мой ответ неверен!
3. Спасибо. У вас есть какие-либо другие идеи?
4. Я бы всегда полностью квалифицировал каждый столбец e, g,
d.thisdate
а неthisdate
, а также изменил имя столбца max (поэтому назовите егоmaxCreated
вместоcreated
, просто чтобы устранить любую двусмысленность. Это может помочь понять, что происходит.5. OPENQUERY — это решение, т.Е. Обновляется правильная дата (план выполнения также правильный). Знаете ли вы, почему это так? 1.