选择不同的非空行SQL Server 2005

时间:2010-12-04 09:43:48

标签: sql sql-server-2005 select distinct

我遇到了以下问题 我有一张这样的桌子:

ID   ID1     ID2     ID3     ID4     ID5
1   NULL    NULL    NULL    NULL    1
2   NULL    NULL    NULL    2       NULL
3   NULL    NULL    NULL    2       1
4   3       NULL    NULL    2       NULL
5   3       NULL    NULL    2       1
6   NULL    5       NULL    2       NULL

我需要获得不同的行,即NULL等于任何值。对于这个例子,答案是:

ID   ID1     ID2     ID3     ID4     ID5
5   3       NULL    NULL    2       1
6   NULL    5       NULL    2       NULL

P.S。这里ID是主键因此是唯一的。 ID1-ID5 - 任何整数。
提前致谢! 已更新
如果说null等于任何数字,我的意思是它被任何数字吸收

3 个答案:

答案 0 :(得分:4)

这有效,不知道是否可以做得更简单

SELECT ID1, ID2, ID3, ID4, ID5
FROM IDS OUTT
WHERE NOT EXISTS (SELECT 1
                FROM IDS INN
                WHERE OUTT.ID != INN.ID AND
                      (ISNULL(OUTT.ID1, INN.ID1) = INN.ID1 OR (INN.ID1 IS NULL AND OUTT.ID1 IS NULL)) AND
                      (ISNULL(OUTT.ID2, INN.ID2) = INN.ID2 OR (INN.ID2 IS NULL AND OUTT.ID2 IS NULL)) AND
                      (ISNULL(OUTT.ID3, INN.ID3) = INN.ID3 OR (INN.ID3 IS NULL AND OUTT.ID3 IS NULL)) AND
                      (ISNULL(OUTT.ID4, INN.ID4) = INN.ID4 OR (INN.ID4 IS NULL AND OUTT.ID4 IS NULL)) AND
                      (ISNULL(OUTT.ID5, INN.ID5) = INN.ID5 OR (INN.ID5 IS NULL AND OUTT.ID5 IS NULL)))

编辑:如果你的ids永远不会有负数,那就找到一个更甜蜜的选择

SELECT ID1, ID2, ID3, ID4, ID5
FROM IDS OUTT
WHERE NOT EXISTS (SELECT 1
                FROM IDS INN
                WHERE OUTT.ID != INN.ID AND
                      coalesce(OUTT.ID1, INN.ID1,-1) = isnull(INN.ID1,-1) AND
                      coalesce(OUTT.ID2, INN.ID2,-1) = isnull(INN.ID2,-1) AND
                      coalesce(OUTT.ID3, INN.ID3,-1) = isnull(INN.ID3,-1) AND
                      coalesce(OUTT.ID4, INN.ID4,-1) = isnull(INN.ID4,-1) AND
                      coalesce(OUTT.ID5, INN.ID5,-1) = isnull(INN.ID5,-1))  

EDIT2:有一种情况它不起作用 - 如果两行(具有不同的ID)具有完全相同的形式。我假设它不存在。如果存在这样的事情,则首先在基表上首先创建一个具有select distinct的视图,然后应用此查询。

答案 1 :(得分:1)

我理解的问题陈述:

您从完整的表格开始:

ID   ID1     ID2     ID3     ID4     ID5
1   NULL    NULL    NULL    NULL    1
2   NULL    NULL    NULL    2       NULL
3   NULL    NULL    NULL    2       1
4   3       NULL    NULL    2       NULL
5   3       NULL    NULL    2       1
6   NULL    5       NULL    2       NULL

然后你消除“重复”行,即。与其他行相比较少但值相同的行(NULL除外 - 并且不包括ID列):

  • 第1行被删除,因为第3行相同,但在第1行有NULL的地方有更多值。

  • 第2行同样被(第2行或第4行)消除。

  • 第5行删除第3行和第4行。

然后你会留下第5行和第6行:

ID   ID1     ID2     ID3     ID4     ID5
5   3       NULL    NULL    2       1
6   NULL    5       NULL    2       NULL

我的回答:

坦率地说,我不知道如何使用SQL的SELECT DISTINCT,或者更普遍的是,使用SQL的基于集合的逻辑。我可以想象你可以用更多的程序方法(例如使用游标)进行这种过滤 - 但我无法为此提供解决方案。


关于术语的说明:

  

NULL等于任何值

NULL永远等于任何值,因为NULL本身不是值;这是没有价值的。 NULL本质上意味着“未知”。 (NULL不是值的事实是你不应该写IDx = NULL,而是写IDx IS NULL的原因。)

答案 2 :(得分:0)

如果ID1,ID2(...)始终具有相同的值(如您的示例所示),则可以执行此操作

Select 
 SUM(id1)/COUNT(id1),
 SUM(id2)/COUNT(id2),
 SUM(id3)/COUNT(id3),
 SUM(id4)/COUNT(id4),
 SUM(id5)/COUNT(id5)  From TABLE

SUM和COUNT函数将忽略该空值。 但仍然很困惑你的问题.. :)