2013-01-02 1 views
3

Мне нужно обновить некоторые данные в db на основе определенного значения столбца c1 в моей таблице, теперь я должен сделать то же самое для разных значений для c1, но я не могу использовать if/else, поскольку слишком много случаев, когда я думал о решении с помощью курсоров, но у меня мало опыта с ними (или вообще что-то в этом роде).Как запустить такой же sql с разными данными за большое количество раз

у меня есть:

  • Таблица TAB1
  • Список пар значений (V1, V2)
  • SQL заявление для запуска в списке

    UPDATE TAB1 SET C1=V2 where C1=V1 
    
+0

*** SQL *** это просто * Язык структурированных запросов * - язык, используемый многими системами баз данных, но не продукт базы данных ... многие вещи специфичны для поставщиков, поэтому нам действительно нужно знать, что ** система баз данных ** (и какая версия) вы используете .... –

+0

oracle sql developer – MozenRath

+0

Является ли список пар ценностей также и в таблице? – rene

ответ

2

Если это разовый работа затем с достойной колонки на основе текстового редактора вы можете изменить ваш набор данных из:

1 2 
3 4 

... до ...

select 1 v1 2 v2 from dual union all 
select 3 v1 4 v2 from dual union all 

... и т.д., а затем использовать его как часть объединения заявления, что позволит избежать необходимости иметь дело с обновлением присоединиться мощностные проверки

merge into tab1 using (
select 1 v1 2 v2 from dual union all 
select 3 v1 4 v2 from dual union all 
...) src 
on (src.v1 = tab1.c1) 
when ... etc 
3

Вы дон Не нужно курсор для этой операции. Если у вас есть пары значений в таблице, просто используйте:

UPDATE 
    (SELECT t.C1, vp.V2 
    FROM 
     TAB1 t 
     JOIN 
     ValuePairs vp 
      ON t.C1 = vp.V1 
) tmp 
SET C1 = V2 ; 

Если это только список, вы можете использовать производную таблицу:

UPDATE 
    (SELECT t.C1, vp.V2 
    FROM 
     TAB1 t 
     JOIN 
     (SELECT 1 V1, 2 V2 FROM dual 
     UNION ALL 
      SELECT 2, 3 FROM dual 
     -- ... 

     UNION ALL 
      SELECT 19, 23 FROM dual 
     ) vp 
      ON t.C1 = vp.V1 
) tmp 
SET C1 = V2 ; 
+0

Я не имею его в таблице, но в своем блокноте – MozenRath

+0

@MozenRath почему бы не сохранить ваш блокнот в таблице темпа и не следовать курсу ypercube (либо обновленное сообщение, либо его слияние)? – DazzaL

+0

Хм ... просто понял, что нет простого способа: P. Будет создавать временную таблицу. хотя хотелось бы избежать этого, мне просто нужно будет удалить его позже – MozenRath

-1
you can try like this without creating the table. 

    bytes = readFile(FilenamewithPath); 
    file = Encoding.ASCII.GetString(bytes); 
    public static byte[] readFile(bool delFileOnRead, string fileNameWithPath) 
    { 
    try { 
       FileStream fsSource = new FileStream(fileNameWithPath, FileMode.Open, FileAccess.Read); 
       byte[] retVal = new byte[fsSource.Length]; 
       int numBytesToRead = (int)fsSource.Length; 
       int numBytesRead = 0; 
       while (numBytesToRead > 0) 
       { 
        int n = fsSource.Read(retVal, numBytesRead, numBytesToRead); 
        if (n == 0) 
         break; 
        numBytesRead += n; 
        numBytesToRead -= n; 
       } 
       fsSource.Close(); 
       fsSource.Dispose(); 
       if (delFileOnRead) 
       { 
        File.Delete(fileNameWithPath); 
       } 
       return retVal; 
      } 
      catch(Exception ex) { 
       throw ex; 
      } 

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