2012-07-24 17 views
11
+------------------+ 
| 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 

Así que, básicamente, quiero seleccionar donde las condiciones de (id1, id2) = (valor1, valor2). igual que la declaración a continuación:Actualización SQL donde en el conjunto de datos

WHERE id1 = value1 AND id2 = value2 
embargo

en conjunto de valores en una matriz. ¿Esto es posible?

Gracias de antemano

EDIT: Estoy utilizando SQL Server 2008. Lo siento si no era demasiado clara. Estoy tratando de poner esto como un procedimiento almacenado y llamarlo desde un servicio. La entrada sería una especie de matriz (tamaño variable) y encontraría una coincidencia con las dos ID en una fila.

+3

¿Qué base de datos está usted utilizando? –

Respuesta

2

Esta es la manera de hacerlo en MSSql. Todo lo que necesita es hacer un valor (en este ejemplo VARCHAR) de Id1 e Id2. En este caso, puede usar la instrucción IN con los valores establecidos. También debería pensar en NULL en id1 e id2 si están permitidos en estos campos (simplemente agregue: 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') 
+0

Muchas gracias. Esto es exactamente eso. Pero comparar varchar no es realmente bueno, en cuanto a rendimiento, ¿no? –

+0

En realidad, puede hacer cualquier tipo de valor de búsqueda. Por ejemplo, si digamos id1, id2 siempre <1000 en su tabla, puede reemplazar esta instrucción WHERE por: WHERE id1 * 1000 + id2 in (1001,2001). En este caso, ni siquiera se convierte a cadenas. – valex

0

si está utilizando SQL Server intente esto

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

probar esto si está utilizando Oracle

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

Utilizamos generalmente en la cláusula si tenemos más de un valor para que coincida. suponiendo que (id1 = valor1 y ID2 = valor2) y (id1 = valor3 y ID2 = valor4)

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

Gracias por responder. Intenté esto en el servidor SQL, y se ejecutó muy bien. Sin embargo, los resultados no fueron lo que estoy buscando. Dio resultados divertidos, que no estoy seguro de lo que hace la declaración de condición. ¿Te importaría explicar, quizás aplicable para otras cosas? Gracias –

+0

mi código era más adecuado con Oracle porque uso Oracle, voy a editar mi respuesta para explicarlo de nuevo usando el servidor SQL – user1512999

0

Una idea de lograr esto es hacer uso de la tabla temporal

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 
0

Try This - Versión de 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; 
0

Esta consulta funciona en el oráculo ...

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

Cuál es su base de datos?

+0

Lamento no haber puesto esos detalles. Estoy usando SQL Server 2008 –

+0

¿Cuál es el tipo de datos de entrada para la condición where? Supongo que Array no está presente en SQL Server 2008. – TechDo

0

¿Qué está tratando fundamentalmente de hacer? ¿Por qué es esta la manera en que has elegido hacerlo? Parece que eres un poco confuso en la comprensión de la lógica basada en conjuntos. Cada una de las respuestas proporcionadas por otros carteles es válida y funcionará, pero puede no ser la más adecuada para su propósito. ¿Este procesamiento está en contra de un conjunto de datos existente? ¿Es parte de una carga de datos o proceso de inserción? Cada uno de los campos ID que ha enumerado tiene su propio rango de valores únicos. Sobre la base de tu ejemplo, parece que lo que está realmente querer hacer es actualizar el valor bool cuando ID2 = 1

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

Lo más probable es que usted está deseando desarrollar una lógica que establece el valor Bool en base a unos datos regla, por ejemplo, si Id2 es menor que o igual a Id1. Una declaración de caso trabaja aquí:

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

Esto es mucho más eficiente cuando se trata de grandes conjuntos de datos de escritura y/o de reglas en su cláusula WHERE para todos y cada variación de los valores de insertar.

Piense en WHERE como un filtro y no como un lugar para implementar si escribe lógica.

En las inserciones de datos pequeños (si escribe valores manualmente en los campos de la tabla, está insertando desde algún tipo de formulario web transacción por transacción) probablemente sea más simple establecer manualmente el valor como mejor considere, o compilarlo en la parte de procedimiento de su sistema y aplicar una regla de validación a la tabla.

Si desea escribir un procedimiento almacenado que lo haga, cree variables para los valores de ID y vincúlelas a cualquier sistema que transmita la información externa en su sistema de base de datos. (Presumiré que ya ha creado las estructuras de tabla);

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 

Este proceso puede ser llamado por su programa y transfiere las variables que pueda generar a partir de una matriz. También hay formas en que puede importar los valores directamente a la columna apropiada y luego ejecutar la lógica de Bool en el código posterior a la inserción. "Hard Coding" una declaración WHERE para manejar cada caso es ineficiente, y un mal hábito para entrar.

0

Puede enviar su lista de valores al procedimiento almacenado como XML. Desempaquete la variable XML to table y use exists para encontrar las filas que debe actualizar.

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) 

llamada así:

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