2016-05-19 7 views
1

Ich arbeite an einem Projekt, wo ich mehrere Datensätze in derselben Spalte aktualisieren muss. Meine Werte werden in der Liste genauso wie die IDs gespeichert, die ich in meiner WHERE-Klausel verwenden muss. Ich frage mich, ob ich 'IN' anstelle von '=' verwenden und alle Werte aus meiner Liste aktualisieren kann? Hier ist mein Code für Listen:Kann ich 'in' verwenden, um das Feld anstelle von '=' in SQL Oracle zu aktualisieren?

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

Sie sehen wie folgt aus:

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

Hier ist meine Update-Anweisung:

<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> 

habe ich 'IN' für meine WHERE-Klausel in der Vergangenheit, aber ich habe nie in meinem SET verwendet. Lass mich wissen, ob ich hier etwas falsch mache oder ob es einen besseren Weg dafür gibt. Ich habe das immer noch nicht ausprobiert, weil ich ungefähr 20k Datensätze aktualisieren muss und ich möchte sicherstellen, dass dies der beste Weg ist, bevor ich mein Update ausführe. Vielen Dank!

+0

Nein - Sie können ein Feld nur auf einen einzelnen Wert setzen, so dass 'in' keinen Sinn ergibt. Erstellen Sie eine temporäre Tabelle (oder eine statische Tabelle, wenn sich die Suche selten ändert) mit zwei Spalten, und verbinden Sie sich dann mit dieser Tabelle im Update. –

+0

Ich kann keine temporären Tabellen in meinem Projekt verwenden. So muss ich Listen verwenden und versuchen, meine Aufzeichnungen auf diese Weise zu aktualisieren. Was wäre dann die andere Option? Vielen Dank. –

+0

Sie können eine massive Verbindung in einer Unterabfrage erstellen, um eine quasi-temporäre Tabelle zu erstellen. –

Antwort

0

würde ich eine Tabelle erstellen, die Zuordnung zu Hause und, um es in Ihrem UPDATE beitreten:

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

Wenn eine temporäre Tabelle keine Option ist, würde ich nur 20K Updates laufe, anstatt zu versuchen, es zu einem komprimieren Erklärung. Jede anständige Datenbank sollte kein Problem damit haben.

Verwandte Themen