2015-09-16 2 views
0

Я не понимаю, почему этот запрос t-sql не работает.Обновление одной таблицы с датой, которую я только что получил из подзапроса в tsql

Что такое MSSQL (или просто SQL) в общем, что не позволит мне обновить одну таблицу с датой, которую я только что получил из подзапроса?

UPDATE table1 
SET someOldDate = innertable.derivedDate 
WHERE 
uniqueId in 

(SELECT CAST(str(table2.VisitMo)+"/"+str(table2.Visitday)+"/"+ str(table2.Visityr) as datetime) as derivedDate 
    ,uniqueId 
FROM table1 t1 INNER JOIN table2 t2 
ON t1.uniqueId = t2.uniqueId 
WHERE CAST(str(t2.VisitMo)+"/"+str(t2.visitday)+"/"+ str(t2.visityr)) != t2.someOldDate) as innertable 

Я не против того, что запрос не работает, но это сводит меня с ума, что я не понимаю, почему он не работает. Любые философские советы с радостью приняты.

ответ

0

попробовать с этим:

Update table1 
SET table1.someOldDate = 
CAST(str(table2.VisitMo)+"/"+str(table2.Visitday)+"/"+ str(table2.Visityr) as datetime) 
From table1 
inner join table2 On table1.uniqueId = table2.uniqueId. 
where CAST(str(table2.VisitMo)+'/'+str(table2.visitday)+'/'+ str(table2.visityr)) != table2.someOldDate 
0

В случае, когда вы используете

WHERE X IN (SUBQUERY) 

процесс SQL заключается в следующем:

  1. Выполнить подзапрос для получения списка значений
  2. Сравните этот список значений со значениями в столбце X
  3. Основываясь на значении истинности этого сравнения, включите или исключите каждую строку для выбора/вставки/обновления.

Ни в одной точке в этом процессе является любая информация, вырубился о , которые запись или записи из списка соответствует значению в колонке X. Это то, что делает IN полезным - SQL минимизирует количество работы он делает говоря, что «это работает, если X находится в этом списке хотя бы один раз».

Если вы хотите сделать что-то вроде «таблицы обновлений A на основе общей ссылки на B», вы можете посмотреть, как использовать JOINs в вашем UPDATE. Pinal Dave is a pretty good resource.

0

У вас есть предложение IN, которое, как представляется, проверяет, находится ли список uniqueId в списке возможных значений. Однако: ваш подзапрос возвращает две колонок .....

Так в основном, у вас есть

UPDATE table1 
SET someOldDate = innertable.derivedDate 
WHERE uniqueId IN (SELECT derivedDate, uniqueId 
        FROM table1 t1 .....) 

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

uniqueId не могут быть проверены по списку (derivedDate, uniqueId) - он должен быть проверен на наличие в списке только (uniqueId) ....

Смежные вопросы