Обновление SQL, где в наборе данных

+------------------+
| id1 | id2 | bool |
+------------------+
|  1  |  1  |  F   |
|  1  |  2  |  F   |
|  2  |  1  |  F   |
+------------------+

UPDATE table_name
SET bool = T
WHERE (id1, id2) IN ((1,1),(2,1)) --Need work here

Поэтому в основном я хочу выбрать, где условия (id1, id2) = (значение1, значение2). Как и в приведенном ниже заявлении:

WHERE id1 = value1 AND id2 = value2

однако в наборе значений в массиве. Возможно ли это?

Заранее спасибо

EDIT: Я использую SQL Server 2008. Извините, если это было не слишком ясно. Я пытаюсь установить это как хранимую процедуру и вызвать ее из службы. Ввод будет своего рода массивом (переменный размер) и найти совпадение с двумя идентификаторами в строке.

Ответ 1

Вот как это сделать в MSSql. Все, что вам нужно, - сделать одно значение (в этом примере VARCHAR) из Id1 и Id2. В этом случае вы можете использовать оператор IN с установленными значениями. Также вы должны думать о NULL в id1 и id2, если они разрешены в этих полях (просто добавьте: and id1 is not null and id2 is not null).

UPDATE table_name
SET bool = T
WHERE convert(varchar(20),id1)+','+convert(varchar(20),id2) in ('1,1','2,1')

Ответ 2

если вы используете SQL Server, попробуйте это

     UPDATE table_name
     SET bool = T
     WHERE (convert(varchar 20, id1) + '-' + convert(varchar 20 , id2)) 
      IN (convert(varchar 20 , value1) + '-' + convert(varchar 20 , value2),
        convert(varchar 20 , value3) + '-' + convert(varchar 20 , value4));

попробуйте это, если вы используете oracle

     UPDATE table_name
     SET bool = T
       WHERE (id1 || '-' || id2) IN (value1 || '-' || value2)

обычно мы используем в условии, если у нас есть больше, чем одно значение для соответствия. предполагая, что вы (id1 = значение1 и id2 = значение2) и (id1 = значение3 и id2 = значение4)

     UPDATE table_name
     SET bool = T
     WHERE (id1 || '-' || id2) IN (value1 || '-' || value2, value3 || '-' || value4)

Ответ 3

Одна из идей для достижения этой цели - использовать временную таблицу

Create Table #Temp
(
  id1 int,
  id2 int
)
insert into #Temp values(1,1)
insert into #Temp values(1,2)
insert into #Temp values(2,1)
insert into #Temp values(2,2)

--update data
UPDATE 
table_name 
SET bool = T 
from table_name T1   
inner join #Temp T2 
on T1.Id1= T2.Id1
and T1.Id2= T2.Id2

Ответ 4

Попробуйте это - версия SQL Server 2008.

create table mytable
(
id1 int,
id2 int,
bool char(1)
);

insert INTO mytable VALUES(1,1,'F');
insert INTO mytable VALUES(1,2,'F');
insert INTO mytable VALUES(2,1,'F');

SELECT * FROM mytable;

update mytable 
set bool='T'
WHERE exists (SELECT id1,id2 from mytable tb2
where mytable.id1 = 1 AND mytable.id2 = 1
or mytable.id1 = 2 AND mytable.id2 = 1);

SELECT * from mytable;

Ответ 5

Этот запрос работает в oracle...

UPDATE table_name 
SET BOOL = T 
WHERE (id1, id2) IN (SELECT 1,1 FROM DUAL UNION SELECT 2,1  FROM DUAL);

Какая ваша база данных?

Ответ 6

Что вы в основном пытаетесь сделать? Почему так вы выбрали это? Кажется, вы немного размыты в понимании логики на основе набора. Каждый из ответов, предоставленных другими плакатами, действителен и будет работать, но не может быть наиболее подходящим для вашей цели. Эта обработка связана с существующим набором данных? Является ли это частью процесса загрузки или вставки данных? Каждое из полей идентификатора, которое вы указали, имеет собственный диапазон уникальных значений. На основе вашего примера видно, что то, что вы действительно хотите сделать, это обновить значение bool, когда ID2 = 1

UPDATE table_name SET Bool = 'T'
WHERE Id2 = 1

Скорее всего, вы хотите разработать логику, которая устанавливает значение Bool на основе некоторого правила данных - например, если Id2 меньше или равно Id1. Здесь приводится описание дела:

UPDATE table_name SET Bool = CASE WHEN Id1 > Id2 THEN 'T' ELSE 'F' END

Это гораздо эффективнее, когда вы имеете дело с большими наборами данных, чем записываете в правила AND/OR в вашем предложении WHERE для каждого изменения значений, которые вы вставляете.

Думайте о WHERE как о фильтре, а не как о месте реализации, если логика типа /then.

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

Если вы хотите написать хранимую процедуру, в которой вы создаете переменные для значений идентификатора, и свяжите их с любой системой, которая передает внешнюю информацию в вашу систему базы данных. (Я предположим, что вы уже создали структуры таблицы);

CREATE PROCEDURE table_name_insert
@Id1 Int NOT NULL,
@Id2 Int NOT NULL

-- If you want to execute the logic outside of the DB environment
-- (perhaps as part of an SSIS package) then you will want to add this
-- variable and pass it in explicitly.

, @Bool bit NOT NULL 


AS

DECLARE @sql nvarchar(4000)


SET @sql = '
INSERT INTO table_name (ID1, ID2, Bool)
SELECT @Id1, @Id2, [Case Logic or Variable Value for Bool]
' EXEC sp_executeSQL @sql

Этот процесс может быть вызван вашей программой, и вы передаете переменные, которые вы можете генерировать из массива в него. Существуют также способы, в которых вы можете импортировать значения непосредственно в соответствующий столбец, а затем выполнить логику Bool в коде после вставки. "Hard Coding" оператор WHERE для обработки каждого случая неэффективен и имеет плохую привычку вступать.

Ответ 7

Вы можете отправить список значений в хранимую процедуру как XML. Распакуйте переменную XML в таблицу и используйте exists, чтобы найти строки, которые вы должны обновить.

create procedure YourSP
  @XMLParam xml
as

declare @T table(id1 int, id2 int)

insert into @T(id1, id2)
select T.N.value('id1[1]', 'int'),
       T.N.value('id2[1]', 'int')
from @XMLParam.nodes('/Row') as T(N)

update table_name
set bool = 'T'
where exists (select *
              from @T as T
              where T.id1 = table_name.id1 and
                    T.id2 = table_name.id2)

Вызов:

exec YourSP '<Row>
               <id1>1</id1>
               <id2>1</id2>
             </Row>
             <Row>
               <id1>2</id1>
               <id2>1</id2>
             </Row>'