2013-07-04 79 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 
相关问题