2010-05-03 20 views
9

Tengo una tabla y quiero intercambiar los valores de dos filas. Tengo las filas ID de las dos filas. ¿Hay alguna consulta para hacer eso? Aquí hay un ejemplo. Antes de la consulta tengo esto:Intercambiar valores para dos filas en la misma tabla en SQL Server

 
row1 : 1,2,3 
row2 : 5,6,7 

Tras el canje quiero esto:

 
row1 : 5,6,7 
row2 : 1,2,3 

no quiero escribirlo en código .NET, porque creo que una consulta SQL es más fácil que eso.

+0

La primera vez que leí tu pregunta pensé que quería hacer una copia de una fila , pero ahora estoy empezando a pensar que quieres actualizar los valores en una fila para igualar los valores en otra fila ... pero no entiendo la parte "viceversa" de tu pregunta. ¿Puedes dar algunos ejemplos para ayudar a aclarar tu pregunta? –

+0

Viceversa aquí significa que necesito también para actualizar la fila que tomé los datos de ella con los datos de fila actualizada ejemplo: fila1: 1,2,3 fila2: 5,6,7 después de hacer frente i quieren fila1: 5,6,7 fila2: 1,2,3 Espero que lo hayas conseguido. –

+0

@ AmroSH: He reescrito su pregunta para que sea más fácil de entender. Espero haberlo hecho correctamente; de ​​lo contrario, edítalo de nuevo. Y deberías tratar de escribir tu pregunta claramente en el futuro: obtendrás respuestas de mejor calidad más rápidamente. –

Respuesta

6

Si desea cambiar los valores de una fila a otra para dos identificadores conocidos intentar algo como esto:

--need to store the original values 
SELECT 
    *,CASE WHEN id=123 then 987 ELSE 123 END AS JoinId 
    INTO #Temp 
    FROM YourTable 
    WHERE ID in (123,987) 

--swap values 
UPDATE y 
    SET col1=t.col1 
     ,col2=t.col2 
    FROM YourTable  y 
     INNER JOIN #Temp t ON y.id =t.JoinId 
    WHERE ID in (123,987) 
+0

Gracias KM es que esta consulta funciona con varias filas significa que esos ID son claves forign y tengo que cambiar sus filas. –

+0

esto debería funcionar si las columnas para intercambiar son claves externas o solo datos simples. –

+0

¿Funciona esto con la clave principal? –

1

creé una tabla con nombre de columnas y el género. Inserté valores en él. Ahora quiero intercambiar valores en la columna de género como M = F, F = M.

2

actualización simple funciona:

UPDATE myTable 
SET 
col1 = CASE WHEN col1 = 1 THEN 5 ELSE 1 END, 
col2 = CASE WHEN col2 = 2 THEN 6 ELSE 2 END, 
col3 = CASE WHEN col3 = 3 THEN 7 ELSE 3 END 

Resultado: valores de fila se intercambian.

1

Tuve un problema similar recientemente. Tenía una columna para pedir la salida y quería permitir el cambio de la orden. Estaba buscando la respuesta y encontré esta pregunta. Esto no respondió suficientemente a mi consulta en particular, pero tal vez mi solución ayudará a otros.

tuve mi base de datos se parece a lo que

Tabla: Order_Table

Index_Column,Order_Column,Text 
1   ,1   ,"Second Test text" 
2   ,2   ,"First Test text" 

que quería ser capaz de intercambiarlos alrededor de usar PDO en php. En última instancia he encontrado una manera de hacerlo con una consulta SQL

UPDATE `Order_Table` AS o 
INNER JOIN (SELECT `Index_Column`, `Order_Column` FROM `Order_Table` 
WHERE `Index_Column` IN (:Index1,:Index2)) 
AS t ON o.`Index_Column` <> t.`Index_Column` 
SET o.`Order_Column` = t.`Order_Column` 
WHERE o.`Index_Column` IN (:Index1,:Index2) 
2
UPDATE t1 
SET 
t1.col1 = t2.col1 
,t1.col2 = t2.col2 
,t1.col3 = t2.col3 
,t1.col4 = t2.col4 
--and so forth... 
FROM YourTable AS t1 
INNER JOIN YourTable AS t2 
    ON  (t1.ID = '1' 
      AND t2.ID = '2') 
     OR 
      (t1.ID = '2' 
      AND t2.ID = '1') 

Usted no necesariamente tiene que utilizar la columna ID de la tabla, creo que podría buscar por cualquier columna, con el buen uniendo la lógica. Unirse a la mesa en sí mismo es el truco.

+0

es posible cambiar todo en bruto si actualizo una columna solo con su consulta. ? Porque solo actualicé una columna solo con su consulta y se cambió toda la fila. – FullStack

1

Debe seleccionar todos los registros por la condición "WHERE", Luego, la actualización "SET" por el estado "CASE".

UPDATE tbl_Temp SET 
fk_userType = CASE fk_userType WHEN 1 THEN 2 WHEN 2 THEN 1 END, 
fk_userRole = CASE fk_userRole WHEN 1 THEN 2 WHEN 2 THEN 1 END 
WHERE (fk_userType = 1 AND fk_userRole = 1) OR (fk_userType = 2 AND fk_userRole = 2); 
0

Ninguno de los ejemplos anteriores es práctico ... Debe quedar como la siguiente sección de actualización:

/*******************************************************************************/ 
/* DATA TABLE IS PREPARING             */ 
/*******************************************************************************/ 
IF EXISTS (SELECT TOP 1 * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'TEST' AND TABLE_SCHEMA = 'dbo') 
DROP TABLE [dbo].[TEST]; 

CREATE TABLE [dbo].[TEST](
    [ID]  int   IDENTITY(1,1) NOT NULL, 
    [Name]  varchar(50) NULL, 
    [Surname] varchar(50) NULL, 
    [AGE]  int   NULL, 
    CONSTRAINT [PK_TEST] PRIMARY KEY CLUSTERED 
    ([ID] ASC) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
GO 
/*******************************************************************************/ 
/* INSERTING TEST VALUES              */ 
/*******************************************************************************/ 
INSERT INTO dbo.TEST (Name, Surname, AGE) 
SELECT 'Sevim'  , 'PARLAYAN' , 36 UNION ALL 
SELECT 'Uğur'   , 'PARLAYAN' , 41 UNION ALL 
SELECT 'Berkan Cahit' , 'PARLAYAN' , 17 UNION ALL 
SELECT 'Miray Çağla' , 'PARLAYAN' , 6 ; 

SELECT * FROM dbo.TEST ORDER BY ID; 


-- At this point maybe the trigger can be disabled... 

/*******************************************************************************/ 
/* I'm swapping Uğur and Sevim rows (So, rows into 1 and 2 do swapping)... */ 
/*******************************************************************************/ 
UPDATE TT 
SET  TT.Name  = ZZZ.Name 
    , TT.Surname = ZZZ.Surname 
    , TT.AGE  = ZZZ.AGE 
FROM  dbo.TEST as TT 
JOIN  (
      SELECT TOP 1 * FROM dbo.TEST WHERE ID = 2 /* Big key value first  */ UNION ALL 
      SELECT TOP 1 * FROM dbo.TEST WHERE ID = 1 /* Then small key value... */ 
     ) as ZZZ on ZZZ.ID in (1, 2) 
WHERE TT.ID in (1, 2) ; 

-- At this point maybe the trigger can be activated... 

SELECT * FROM dbo.TEST ORDER BY ID 
Cuestiones relacionadas