2017-07-31 98 views
0

我在這裏有這個查詢,我需要將其轉換爲更新語句。使用DISTINCT結果將SELECT查詢轉換爲UPDATE。 Microsoft SQL服務器

查詢:

SELECT DISTINCT RIGHT(Domain, LEN(Domain) - CHARINDEX('@', Domain)) AS email_domain 
FROM dbo.DomainsV7 
WHERE Domain IS NOT NULL; 

我有一些數據其中之一是存儲在一個名爲「域」列電子郵件的表。

我需要更新「域」於是我劃的郵件,只留域(例如:[email protected]將查詢後像 這testmail.com)。所以域列中存儲 內超過290000電子郵件,也有一些空的...

正如我說我找域名,我不需要留下的數據,幷包括@也不要需要在 域列中重複的域列表或NULL值。所以我在尋找的是一個查詢,它將修剪 電子郵件以將它們轉換爲域,同時查詢將 刪除具有NULL值和重複域的數據。

最終結果應該是隻有唯一域且內部沒有NULL的域。

表名:dbo.DomainsV7

表結構:

COLUMN NAME  |  DATA TYPE  | ALLOW NULLS 
----------------+---------------------+----------------- 
    Domain  |  Varchar(60)  |  YES 

^犯了錯誤允許在首位NULL數據。

下面是表現在的樣子:

+-------------------------+ 
    |   Domain   | 
    +-------------------------+ 
    | [email protected] | 
    | [email protected] | 
    | [email protected] | <- Will be removed after update (Duplicate) 
    |   ...   | 
    +-------------------------+ 

這裏是我所需要的表更新後看:

+-------------------------+ 
|   Domain   | 
+-------------------------+ 
|  fakemail.com  | 
| randommail.com  | 
|   ...   | 
+-------------------------+ 

回答

3

3個階段爲3項任務:

第一,我們更新域以僅包括域

update d1 
set domain = RIGHT(Domain, LEN(Domain) - CHARINDEX('@', Domain)) 
from DomainsV7 d1 
where d1.domain is not null 
and CHARINDEX('@', d1.Domain) > 0 -- in case there is a value with no '@'; 

接下來,我們一路平安空白的人

delete from domainsv7 
where domain is null; 

最後,我們刪除重複

with CTE as 
(
select domain, row_number() over(partition by domain order by domain) rn 
from domainsv7 
) 
delete from CTE 
where rn >1; 
+0

我在想遊標,但我知道它會慢,但我沒有得到你的答案,你可以請eaborate你的答案 –

+0

一切順利,直到第三步。我收到此錯誤消息:「消息5308,級別16,狀態1,行34 窗口函數和NEXT VALUE FOR函數不支持整數索引作爲ORDER BY子句表達式。「 – Vissow

+2

你不可以按'1'排序,替換爲'按域排序' –

2

你想要的域創建一個新表,然後重新插入它們:

SELECT DISTINCT RIGHT(Domain, LEN(Domain) - CHARINDEX('@', Domain)) AS email_domain 
INTO #domains 
FROM dbo.DomainsV7 
WHERE Domain IS NOT NULL; 

TRUNCATE TABLE dbo.DomainsV7; 

INSERT INTO dbo.DomainsV7 (domain) 
    SELECT email_domain 
    FROM #domains;