2016-05-19 2 views
1

Я работаю над проектом, где мне нужно обновить несколько записей в одном столбце. Мои значения хранятся в списке, таком же, как ID, который я должен использовать в своем предложении WHERE. Мне было интересно, могу ли я использовать «IN» вместо «=» и обновлять все значения из моего списка? Вот мой код для списков:Могу ли я использовать 'in' для обновления поля вместо '=' в Oracle oracle?

<cfset listUserNum = ArrayToList(userNum)> 
<cfset listUserCode = ArrayToList(userCode)> 

Они выглядят так:

listUserNum = "72,15,71,27,16,14,22"; 
listUserCode = "B,B,C,T,R,M,Y"; 

Вот мое заявление обновление:

<cfquery name="UpdateUsers" datasource="test"> 
    Update Users 
    Set UserCode in <cfqueryparam value="#listUserCode#" cfsqltype="cf_sql_varchar" list="yes" /> 
    Where UserNumber in <cfqueryparam value="#listUserNum#" cfsqltype="cf_sql_integer" list="yes" /> 
</cfquery> 

Я использовал 'IN' для моего ИНЕКЕ в прошлое, но я никогда не использовал его в своем SET. Дайте мне знать, если я делаю что-то неправильно здесь или если есть лучший способ сделать это. Я все еще не пробовал это, потому что мне нужно обновить около 20 тыс. Записей, и я хочу убедиться, что это лучший способ, прежде чем запускать мое обновление. Спасибо!

+0

Нет - вы можете установить поле только на одно значение, поэтому 'in' не имеет смысла. Создайте временную таблицу (или статическую таблицу, если поиск редко изменяется) с двумя столбцами, а затем присоединитесь к этой таблице в обновлении. –

+0

Я не могу использовать временные таблицы в своем проекте. Таким образом, я должен использовать списки и пытаться обновить мои записи таким образом. Какой будет другой вариант? Спасибо. –

+0

Вы _could_ делаете массивный союз в подзапросе, чтобы создать квази-временную таблицу. –

ответ

0

Я хотел бы создать таблицу для размещения, что отображение и присоединиться к нему в ваших UPDATE:

Update u 
Set UserCode = l.UserCode 
FROM Users u 
INNER JOIN Lookup l 
    ON u.UserNumber = l.UserNumber 
Where UserNumber in <cfqueryparam value="#listUserNum#" cfsqltype="cf_sql_integer" list="yes" /> 
0

Если временная таблица не вариант, я бы просто запустить 20K обновления вместо того, чтобы пытаться сжать его в один заявление. Любая достойная база данных не должна иметь проблем с обработкой.