2010-05-03 5 views
9

Ich habe Tabelle, und ich möchte die Werte aus zwei Zeilen tauschen. Ich habe die Zeilen IDs der zwei Zeilen. Gibt es eine Abfrage, um das zu tun? Hier ist ein Beispiel. Vor der Abfrage habe ich diese:Swap-Werte für zwei Zeilen in der gleichen Tabelle in SQL Server

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

Nach dem Swap ich dies will:

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

Ich will es in .NET-Code nicht schreiben, weil ich eine SQL-Abfrage denken ist einfacher als das.

+0

Das erste Mal, dass ich Ihre Frage habe ich gelesen, haben Sie eine Kopie einer Zeile machen wollte , aber jetzt fange ich an zu denken, dass Sie die Werte in einer Zeile aktualisieren wollen, um den Werten in einer anderen Zeile zu entsprechen ... aber ich bekomme nicht den 'vice versa' Teil Ihrer Frage. Können Sie einige Beispiele zur Klärung Ihrer Frage nennen? –

+0

Umgekehrt bedeutet hier, dass ich brauche auch die Zeile zu aktualisieren, die ich von ihm nahm Daten mit den Daten aus Zeile aktualisiert Beispiel: row1: 1,2,3 row2: 5,6,7 nach Bewältigungs i wollen row1: 5,6,7 row2: 1,2,3 Ich hoffe du hast es. –

+0

@AmRoSH: Ich habe Ihre Frage neu geschrieben, so dass es leichter zu verstehen ist. Ich hoffe, dass ich es richtig gemacht habe, ansonsten bitte nochmal editieren. Und Sie sollten versuchen, Ihre Frage in Zukunft klar zu formulieren - Sie erhalten schneller bessere Antworten. –

Antwort

6

Wenn Sie Werte tauschen von einer Reihe zur anderen für zwei bekannte IDs wollen versuchen, etwas wie folgt aus:

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

Danke KM ist diese Abfrage funktioniert mit mehreren Zeilen bedeutet, wenn diese IDs forign Schlüssel sind und ich ihre Zeilen tauschen müssen. –

+0

Dies sollte funktionieren, wenn die zu vertauschenden Spalten Fremdschlüssel oder einfach nur Daten sind. –

+0

Funktioniert das mit Primärschlüssel? –

1

Ich habe eine Tabelle mit Spalten Name und Geschlecht. Ich habe Werte eingefügt. Jetzt möchte ich Werte in der Gender-Spalte als M = F, F = M vertauschen.

2

Einfaches Update funktioniert:

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 

Ergebnis: Zeilenwerte vertauscht.

1

Ich hatte ein ähnliches Problem in letzter Zeit hatte ich eine Spalte für die Bestellung der Ausgabe und wollte die Bestellung verschieben lassen. Ich suchte nach der Antwort und stieß auf diese Frage. Dies hat meine spezielle Frage nicht ausreichend beantwortet, aber vielleicht hilft meine Lösung anderen.

hatte ich meine Datenbank

Tabelle wie so

aussehen: um zu tauschen mit gU in PHP Order_Table

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

ich sie in der Lage sein wollte. Schließlich fand ich einen Weg, um es mit einer SQL-Abfrage zu tun

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

Sie müssen nicht unbedingt die ID-Spalte der Tabelle verwenden, ich glaube, Sie nach jeder Spalte, mit dem richtigen Suche konnten Verknüpfungslogik. Sich dem Tisch anzuschließen, ist der Trick.

+0

ist es möglich, ganze rohe auszutauschen, wenn ich eine Spalte nur mit Ihrer Abfrage aktualisieren. ? Weil ich nur eine Spalte nur mit Ihrer Abfrage aktualisiere und die gesamte Zeile vertauscht habe. – FullStack

1

Sie müssen alle Datensätze nach "WHERE" Bedingung auswählen, Dann "SET" Update von "CASE" Zustand.

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

Keine der obigen Beispiele ist praktisch ... Es ist wie das folgende Update Abschnitt aussehen sollte:

/*******************************************************************************/ 
/* 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 
Verwandte Themen