2014-09-23 20 views
0

При обновлении таблицы из другой или при выполнении запроса, который включает в себя сравнение двух таблиц, я обычно имеют привычку запрашивая как нижеВ чем разница между этими двумя запросами?

UPDATE dbo.Table1 SET COL = 
(
SELECT i.colid FROM 
    dbo.Table2 i 
     WHERE i.did = dbo.Table1.did and 
     i.[pdate] = dbo.Table1.pdate and 
     i.pamount = dbo.Table1.pay and 
     i.[Ref No ] = dbo.Table1.refno and 
     i.[cNo ] = dbo.Table1.receipt 
) 

И в последнее время выше меня не подводил. Он возвращает ошибку, говорящую, что запрос возвращает более 1 запись/строку. Однако Мой начальник спросил, как показано ниже, и он работает. Я все еще не могу понять, почему моя неудача и его успех. И почему это никогда не подводило меня раньше?

UPDATE dbo.Table1 SET COL = i.colid 
from 
dbo.Table2 i 
    WHERE i.did = dbo.Table1.did and 
     i.[pdate] = dbo.Table1.pdate and 
     i.pamount = dbo.Table1.pay and 
     i.[Ref No ] = dbo.Table1.refno and 
     i.[cNo ] = dbo.Table1.receipt 
+1

Ваш исходный запрос не будет терпеть неудачу, если в 'Таблица2' для этих критериев' where' не было дубликатов данных. Однако, как только «Таблица2» соответствует нескольким строкам, вы получите свою ошибку. Вы можете сделать свой исходный запрос, используя «SELECT TOP 1» в подзапросе. Я думаю, что 'JOIN', однако, предпочтительнее« коррелированного подзапроса ». – sgeddes

+0

Спасибо, сэр. Меня смущает то, что он также, вероятно, возвращает дубликат. Так почему он прошел? –

ответ

3

Ваш запрос терпит неудачу, потому что он возвращает более одной строки. То есть есть две или несколько строк, которые соответствуют условиям. Я думаю, что это довольно очевидно из ошибки. У вас есть скалярный подзапрос. Он должен возвращать не более одной строки и одной колонки.

Второй работает, потому что объединениям разрешено иметь несколько строк. Однако только одно из значений устанавливается set - из одной из произвольных совпадающих строк. На мой взгляд, это плохая форма, чтобы совпадение нескольких совпадающих строк совпало и выбрано произвольное значение. Но это работает.

+0

Когда вы сказали, что у вас есть несколько совпадений строк, вы хотите сказать, что он вернул несколько совпадающих строк? –

+0

Связано: http://msdn.microsoft.com/en-AU/library/ms177523.aspx * Результаты инструкции UPDATE не определены, если оператор включает предложение FROM, которое не указано таким образом, что только одно значение доступно для каждого обновленного столбца, то есть если оператор UPDATE не является детерминированным. Например, в инструкции UPDATE в следующем сценарии обе строки в таблице 1 соответствуют квалификациям предложения FROM в инструкции UPDATE; но не определено, какая строка из Таблицы 1 используется для обновления строки в Таблице 2. * –

+0

@NuruSalihu. , , Логика соответствия одинакова в двух запросах. Во-первых, контекст говорит, что разрешена только одна строка, поэтому база данных возвращает ошибку. Для второго допускается несколько строк, но только одно произвольно выбирается для обновления. –

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