2013-07-04 77 views
3

嗨我不知道這是否甚至可能在T-SQL中。根據行的組合返回結果

如果第2行和第3行/第5行和第6行的組合存在,那麼這個想法是「不」返回行1和行4。

declare @table table 
(
A int, 
B char(2), 
C char(2), 
D char(2) 
) 

insert into @table 
select 2, 'A1', 'B1', NULL -- row 1 
union 
select 2, 'A1', 'B1', 'C1' -- row 2 and row 3 is a combination (values are equal) 
union      
select 3, 'A1', 'B1', 'C1' 
union 
select 2, 'A2', 'B2', NULL -- row 4 
union 
select 2, 'A2', 'B2', 'C2' -- row 5 and row 6 is a combination (values are equal) 
union      
select 3, 'A2', 'B2', 'C2' 

任何人想要去這個嗎? 謝謝 問候 史蒂夫

+0

也許你應該改寫的問題,沒有任何參考SQL。你想做什麼? –

回答

2

試試這個

SELECT DISTINCT A,B,C,D FROM @table 
WHERE 
A IS NOT NULL AND 
B IS NOT NULL AND 
C IS NOT NULL AND 
D IS NOT NULL 

OR

SELECT DISTINCT A,B,C,D FROM @table 
WHERE 
D IS NOT NULL 
2

這樣的事情?

declare @table table 
(
ID INT , 
A int, 
B char(2), 
C char(2), 
D char(2) 
) 

insert into @table 
select 1, 2, 'A1', 'B1', NULL -- row 1 
union 
select 2, 2, 'A1', 'B1', 'C1' -- row 2 and row 3 is a combination (values are equal) 
union      
select 3, 3, 'A1', 'B1', 'C1' 
union 
select 4, 2, 'A2', 'B2', NULL -- row 4 
union 
select 5, 2, 'A2', 'B2', 'C2' -- row 5 and row 6 is a combination (values are equal) 
union      
select 6, 3, 'A2', 'B2', 'C2' 

SELECT * 
FROM @table t 
WHERE EXISTS(SELECT * FROM @table t1 WHERE t.id IN (t1.id + 1, t1.id + 2) 
     AND t.d IS NULL) 
+0

這就是讓我想要的東西。非常感謝! – Brainlock

+0

@SteveVerschaeve,你會如此友善地將我的迴應標記爲已接受?我剛剛開始參與計算器,似乎我需要更多的點來做一些進一步的活動:) –

+1

嗨路易斯,我希望我可以。在我能夠投票前,我需要15分。當我有足夠的積分時,我會再回來。乾杯,史蒂夫 – Brainlock

2

NOT EXISTS是要走的路:

SELECT A,B,C,D from @table t1 
WHERE NOT EXISTS(
    SELECT 1 FROM @table t2 
    WHERE t1.A < t2.A 
    AND COALESCE(t1.B,'')=COALESCE(t2.B,'') 
    AND COALESCE(t1.C,'')=COALESCE(t2.C,'') 
    AND COALESCE(t1.D,'')=COALESCE(t2.D,'') 
) 

Demo

COALESCE -trick是比較兩個空值。否則null=null將返回null並且包含具有空值的相等行。

+0

null = null的計算結果爲null。在這種特殊情況下,COALESCE技巧將會很好,但不應該用於一般情況。 –

+0

@DaveK:編輯我的答案澄清。你也可以使用AND((t1.B IS NULL AND t2.B IS NULL)OR(t1.B IS NOT NULL AND t2.B IS NOT NULL AND t1.B = t2.B))'等等。但是'COALESCE'更容易閱讀和維護。 –

1

我認爲我們可以通過使用表格的聚合和排序分別過濾記錄來獲得此信息。我相信,要消除這些之後排有組合...... 如果是這樣,下面一個可以工作的行...

declare @table table 
(
A int, 
B char(2), 
C char(2), 
D char(2) 
) 

insert into @table 
select 2, 'A1', 'B1', NULL -- row 1 
union 
select 2, 'A1', 'B1', 'C1' -- row 2 and row 3 is a combination (values are equal) 
union      
select 3, 'A1', 'B1', 'C1' 
union 
select 2, 'A2', 'B2', NULL -- row 4 
union 
select 2, 'A2', 'B2', 'C2' -- row 5 and row 6 is a combination (values are equal) 
union      
select 3, 'A2', 'B2', 'C2' 


SELECT 
T.* 
FROM 
@table T 
INNER JOIN 
(
    SELECT 
    T1.* 
    FROM 
    (
     SELECT 
     ROW_NUMBER() OVER(ORDER BY B,C,D) As RowNumber, 
     MIN(A) AS A, 
     B, 
     C, 
     D, 
     COUNT(1) Cnt 
     FROM @TABLE 
     GROUP BY B,C,D 
    ) T1 
    LEFT JOIN 
    (
     SELECT 
     ROW_NUMBER() OVER(ORDER BY B,C,D) As RowNumber, 
     MIN(A) AS A, 
     B, 
     C, 
     D, 
     COUNT(1) Cnt 
     FROM @TABLE 
     GROUP BY B,C,D 
    ) T2 ON T2.RowNumber = T1.RowNumber + 1 
    WHERE ISNULL(T2.Cnt,0) <= 1 
) NonPostDuplicateRows 
ON T.B = NonPostDuplicateRows.B 
AND T.C = NonPostDuplicateRows.C 
AND T.D = NonPostDuplicateRows.D 
相關問題