2013-02-19 36 views
2

我有一個像下面的表(使用SQL Server 2008 R2企業版):獲取具有相同的「文本」和而不同「典」記載

create table Message 
(
ID int Not Null Primary Key, 
Text nvarchar(100) not null, 
Code nvarchar(50) null 
) 

Insert Into Message Values (1,'Hello Everybody','T6/45') 
Insert Into Message Values (2,'Hello Everybody',Null) 
Insert Into Message Values (3,'Hello Everybody','T6/45') 
Insert Into Message Values (4,'Hello Everybody','T6/45') 
Insert Into Message Values (5,'Hello Everybody','T6/70') 
Insert Into Message Values (6,'Hello Everybody','T6/70') 
Insert Into Message Values (7,'Hello','T6/70') 
Insert Into Message Values (8,'Hello','T6/45') 
Insert Into Message Values (9,'Hello Everybody',Null) 
Insert Into Message Values (10,'Hello Everybody','T6/70') 
Insert Into Message Values (11,'Hello',Null) 

我需要把所有這些具有記錄相同Text但不同的Code。而Code不會是Null

那麼預期輸出將是:

Insert Into Message Values (1,'Hello Everybody','T6/45') 
Insert Into Message Values (5,'Hello Everybody','T6/70') 
Insert Into Message Values (7,'Hello','T6/70') 
Insert Into Message Values (8,'Hello','T6/45') 

我想下面的查詢,但它返回幾行:

select m1.* 
from Message M1 
With (nolock) 
JOIN Message M2 
With (Nolock) 
On m1.Text=m2.Text 
where (m1.ID<>m2.ID 
    and m1.Code<>m2.Code 
    and m1.Code is not null) 

我怎樣才能預期的結果?

另外,這是一個樣本數據庫。我需要在擁有5000萬條記錄的表上運行查詢。所以任何優化的查詢都會有很大的幫助。

+0

「但它返回幾行」 - 你是什麼意思?您的查詢看起來大致正確。什麼是回報,你不期望/想要?它是否返回太多,太少,不同的記錄? – Rup 2013-02-19 09:58:16

+0

它正在返回20行。但預期是4.是的,它返回多個重複行。如..(1 \t您好大家\t T6/45) (1 \t您好大家\t T6/45) (1 \t您好大家\t T6/45) (3 \t您好大家\t T6/45) (3 \t Hello Everybody \t T6/45) (3 \t Hello Everybody \t T6/45) – SKJ 2013-02-19 10:00:33

+0

我喜歡所有的答案。爲大家+1。 :) – SKJ 2013-02-19 10:31:12

回答

2
SELECT ID,TEXT,CODE 
FROM message 
WHERE ID IN 
(
    SELECT MIN(ID) FROM message 
WHERE CODE IS NOT NULL GROUP BY TEXT,CODE 
) 

SELECT 
    MIN(ID) 
    ,TEXT 
    ,CODE 
FROM message 
WHERE CODE IS NOT NULL GROUP BY TEXT,CODE 
ORDER BY MIN(ID) 
1
SELECT m.* 
FROM message m 
WHERE EXISTS (
     SELECT 1 
     FROM message m2 
     WHERE m2.text = m.text 
     AND m2.code = m.code 
     AND m2.code IS NOT NULL 
    GROUP BY m2.text, m2.code 
     HAVING MIN(m2.id) = m.id 
    ) 
1
SELECT DISTINCT m.* 
FROM Message m 
WHERE EXISTS (
    SELECT * 
    FROM Message m1 
    WHERE m1.Id<>m.id 
    AND m1.code<>m.code 
    AND m1.Text=m.Text) 
AND m.Code IS NOT NULL 
+0

感謝Pawan的答案。但它正在返回幾個重複的行。 – SKJ 2013-02-19 10:08:56

+0

嘗試不同的,我已經更新了我的答案 – 2013-02-19 10:11:27

2

嘗試此; SQL-FIDDLE-DEMO

;with cte as (
    select id,text,code, row_number() over (partition by text,code order by id) rn 
    from message 
    where code is not null 
) 
select id,text,code 
from cte 
where rn = 1 
order by id 
+0

+1對於很好的抓住! – 2013-02-19 10:37:22

相關問題