2013-10-09 128 views
0

我有如下表格。SQL Server顯示不匹配的記錄

create table #test (NAME varchar(100),TAGint,checkVAL varchar(1),CATEGORY int) 

insert into #test values('jkl',1,'y',100) 
insert into #test values('abc',1,'y',100) 
insert into #test values('abc',1,'y',101) 
insert into #test values('abc',2,'n',102) 
insert into #test values('abc',3,'n',103) 
insert into #test values('xyz',2,'y',104) 
insert into #test values('xyz',1,'y',105) 

insert into #test values('pqr',1,'y',105) 
insert into #test values('pqr',1,'y',106) 
insert into #test values('pqr',1,'y',106) 

現在我想告訴那些在列名稱,標籤,checkVal不同勢值的記錄。 這就是我所做的。

select * from #test 

;with cte as 
(
select *,row_number() over(partition by NAME,TAG,checkVAL order by CATEGORY) as rownum 
from #test 
) 

select * from cte 
where rownum=1 

這就是正在返回

NAME TAG checkVAL CATEGORY rownum 
----------------------------------------- 
abc  1  y  100  1 
abc  2  n  102  1 
abc  3  n  103  1 
jkl  1  y  100  1 --> This row should not come 
pqr  1  y  105  1 --> This row should not come 
xyz  1  y  105  1 
xyz  2  y  104  1 

什麼我想的是,對於列名的值,如果值是TAG或checkVAL或兩者不同,則這些行只應所示。

下面

jkl  1  y  100  1 

不應顯示,因爲jkl沒有其他行匹配。

以下行不應顯示

pqr  1  y  105  1 

因爲NAME列值pqr所有行TAGcheckVAL有相同的價值觀

我想最好的辦法使用CTE。

回答

3

這個怎麼樣 -

select 
* 
from #test a 
where exists 
(
    select * 
    from 
    #test b 
    where a.name = b.name and (a.tag <> b.tag or a.checkVAL <> b.checkVAL) 
) 
+0

+1簡單而完美的答案! –

+0

這可以通過CTE來完成,我必須將解決方案插入到更復雜的程序 –

+0

感謝好友..設法使用您的解決方案.. –

相關問題