2011-12-01 69 views
5

好吧,這是難以短語,所以這裏去...SQL查詢根據同一表中其他列的值更新列

我正在使用MS SQL Server 2008 R2。我有一個臨時表,可以說有兩個已填充的列。我想根據前兩列的值填充第三個空列。我想要做的是爲col1和col2的每個匹配組合創建一個guid(使用NEWUID())。這裏是一個可視化例子:

可以說我有一個臨時表看起來像這樣開始:

Name Activity SpecialId 
James Running  
James Running 
James Walking 
John Running 
John Running 
John Walking 

我想讓它變得與新的GUID更新,以便它看起來像這樣:

Name Activity SpecialId 
James Running  SOMEFAKEGUID_1 
James Running  SOMEFAKEGUID_1 
James Walking  SOMEFAKEGUID_2 
John Running  SOMEFAKEGUID_3 
John Running  SOMEFAKEGUID_3 
John Walking  SOMEFAKEGUID_4 

請注意如何爲每個匹配對創建一個新的GUID。所以James/Running組合對於所有James/Running組合都具有相同的GUID ...並且John/Running對於John/Running組合也具有相同的GUID,但與James/Running組合沒有相同的GUID。

我試圖讓這個儘可能清楚,但希望那不是很清楚!

有人可以告訴我什麼SQL查詢看起來像是爲了用正確的GUID更新臨時表嗎?

在此先感謝。

瑞安

+0

您使用的是哪個數據庫? –

+0

Concat這兩個字段不是解決方案? – danihp

+0

我正在使用SQL Server 2008,只是更新後。 – Ryan

回答

3

使用NEWID()seems to be a pain。使用它可以創建一個sperate ID,所以你需要一些中間表。

Declare @Table as table (name varchar(20), activity varchar(20) , SpecialID uniqueidentifier) 
Declare @DistinctTable as table (name varchar(20), activity varchar(20) , SpecialID uniqueidentifier) 

INSERT INTO @Table 
(name, activity) 
values 
('James','Running'),  
('James','Running'), 
('James','Walking'), 
('John','Running'), 
('John','Running'), 
('John','Walking') 



WITH distinctt 
    AS (SELECT DISTINCT name, 
         activity 
     FROM @Table) 
INSERT INTO @DistinctTable 
SELECT name, 
     activity, 
     Newid() 
FROM distinctt 

UPDATE @Table 
SET specialid = dt.specialid 
FROM @Table t 
     INNER JOIN @DistinctTable dt 
     ON t.activity = dt.activity 
      AND t.name = dt.name 

SELECT * FROM @Table 

主要生產

name     activity    SpecialID 
-------------------- -------------------- ------------------------------------ 
James    Running    AAA22BC5-51FE-43B3-8CC9-4C4A5B4CC981 
James    Running    AAA22BC5-51FE-43B3-8CC9-4C4A5B4CC981 
James    Walking    1722B76B-5F17-4931-8D7C-2ECADB5A4DFD 
John     Running    FBC1F86B-592D-4D30-ACB3-80DA26B00900 
John     Running    FBC1F86B-592D-4D30-ACB3-80DA26B00900 
John     Walking    84282844-AAFD-45CA-9218-F7933E5102C6 
0

我敢肯定有更好的方法來做到這一點,但你可以嘗試以下方法:

WITH TableId AS 
(
    SELECT DISTINCT Name, Activity 
    FROM YourTable 
) 

UPDATE A 
SET A.SpecialId = B.SpecialId 
FROM YourTable A 
INNER JOIN (SELECT Name, Activity, NEWID() SpecialId FROM TableId) B 
ON A.Name = B.Name AND A.Activity = B.Activity 
+0

我認爲你沒有測試 –

+0

@ConradFrix - 你絕對是對的。我實際上在沒有任何RDBMS的PC上。 – Lamak

+0

我最初嘗試了同樣的事情,但沒有奏效。查看data.se查詢[lamak示例](http://data.stackexchange.com/stackoverflow/s/2212/sample-for-lamak) –

0

好了,我知道你不使用MySQL,但是這是它是如何在MySQL的(測試)

update temp_table, (
select uuid() as spec_key, name, activity from (
select distinct name, activity from temp_table) as anotherTemp) as anotheranotherTemp 
set specialID = anotheranotherTemp.spec_key 
where temp_table.Activity = anotheranotherTemp.activity 
and temp_table.Name = anotheranotherTemp.name; 

它看起來像這樣將工作在SQL 2008(未測試)

MERGE INTO temp_table AS tt 
    USING  (
    select newId() as spec_key, name, activity from (
    select distinct name, activity from temp_table) as anotherTemp 
     ON anotherTemp.activity  = tt.activity 
     and anotherTemp.name = tt.name 
WHEN MATCHED 
    THEN UPDATE 
    SET  specialID = anotherTemp.spec_key; 

雖然表現不會很好。

相關問題