2013-11-14 70 views
0

我有以下SQL代碼,我工作到目前爲止。T/SQL - 查詢重複與扭曲

DECLARE @Table1 TABLE (ID INT Identity (1,1), Col1 varchar(50), Col2 varchar(50)) 
INSERT INTO @Table1 (Col1, Col2) 
VALUES ('CAN','ABCD'),('CAN','ABCE'),('CAN','MNPP'),('CAN','MNPP'),('EDG','MNPP') 

DECLARE @Table2 TABLE (ID INT Identity (1,1), Col2 varchar(50), Col3 varchar(50)) 
INSERT INTO @Table2 (Col2, Col3) 
VALUES ('ABCD','ABC'),('ABCE','ABC'),('MNPP','MNO') 

;WITH TEST_CTE AS 
(
SELECT T1.ID 
     , T1.Col1, T1.Col2 AS T1Col2, T2.Col2 AS T2Col2, T2.Col3 
     , ROW_NUMBER() OVER (PARTITION BY T1.Col1, T2.Col3 ORDER BY T1.ID) AS DuplicateRowNumber 
     , CASE WHEN COUNT(*) OVER (PARTITION BY T1.Col1, T2.Col3) > 1 THEN 1 ELSE 0 END IsMulitple 
FROM @Table1 T1 INNER JOIN @Table2 T2 ON T1.Col2 = T2.Col2 
) 

SELECT * FROM TEST_CTE 

我越來越

ID Col1 T1Col2 T2Col2 Col3 DuplicateRowNumber IsMulitple 
1 CAN  ABCD ABCD ABC  1     1 
2 CAN  ABCE ABCE ABC  2     1 
3 CAN  MNPP MNPP MNO  1     1 
4 CAN  MNPP MNPP MNO  2     1 
5 EDG  MNPP MNPP MNO  1     0 

我期待

ID Col1 T1Col2 T2Col2 Col3 DuplicateRowNumber IsMulitple 
1 CAN  ABCD ABCD ABC  1     1 
2 CAN  ABCE ABCE ABC  2     1 
3 CAN  MNPP MNPP MNO  1     0 
4 CAN  MNPP MNPP MNO  1     0 
5 EDG  MNPP MNPP MNO  1     0 

我的目標: 當我有多個記錄,我重複只能查詢其中T1.Col1和T2.Col3值相同但是T1.Col2值不同。

謝謝

更新:有IsMultiple工作。無法找出DuplicateRowNumber

更新2:nvm以前的更新,與實時數據不能很好地工作。

回答

1

像這樣的東西可能:

;with cte as 
(
select t1.id, t1.col1, t1.col2, t2.col3, dense_rank() over(partition by t1.col1, t2.col3 order by t1.col2) DuplicateRowNumber 
from @table1 t1 
join @table2 t2 on t1.col2 = t2.col2 
) 
select *, sign(max(DuplicateRowNumber) over (partition by col1, col3)-1) Ismultiple 
from cte 

Fiddle

+0

嗯......這是偉大的!謝謝!只是在外部Select查詢中感到困惑。你能解釋一下這背後的邏輯嗎? – 007

+0

如果存在1行,則重複的最大值爲1,如果存在更多行,則最大值爲1。減1並取*符號*值,其中*符號0 *爲0且正值爲1(負值返回-1) –

+0

這太棒了!感謝(數學)解釋。 :) – 007