【问题标题】:Select distinct multiple field without NULL选择不带 NULL 的不同的多个字段
【发布时间】:2011-10-24 17:39:04
【问题描述】:

我有一个带有值 ID 和值的表

--------------
| id | value |
--------------
|  1 |  NULL |
--------------
|  1 |     A |
--------------
|  2 |  NULL |
--------------
|  2 |  NULL |
--------------
|  3 |     B |
--------------
|  3 |     B |
--------------
|  3 |     B |
--------------

我需要从表中选择不同的 id 和相应的值。选择 Id 时应该是唯一的,如果它在 value 字段中有多个值,则它应该只检索而不是 NULL 值

所以结果应该如下所示。

--------------
| id | value |    
--------------
|  1 |     A |
--------------
|  2 |  NULL |
--------------    
|  3 |     B |
--------------

如何做到这一点?使用 SQL Server 2005

【问题讨论】:

  • 是否有可能存在带有 (3, 'C') 的行,并且您希望结果同时包含 (3, 'B') 和 (3, 'C')? Lieven 的回答没有处理这种情况,但可以正确处理您问题中当前的数据。

标签: sql tsql distinct-values notnull


【解决方案1】:

您可以使用普通的GROUP BY

GROUP BY

  • 1 中删除NULL 值,因为存在其他值。
  • 保留2NULL 值,因为它只有NULL 值。

SQL 语句

SELECT  id
        , MIN(value)
FROM    YourTable
GROUP BY
        id

测试脚本

;WITH q (id, value) AS (
    SELECT 1, NULL
    UNION ALL SELECT 1, 'A'
    UNION ALL SELECT 2, NULL
    UNION ALL SELECT 2, NULL
    UNION ALL SELECT 3, 'B'
    UNION ALL SELECT 3, 'B'
    UNION ALL SELECT 3, 'B'
)
SELECT  id
        , MIN(value)
FROM    q       
GROUP BY
        id

【讨论】:

  • @gvLearner:使用顶部脚本。底部脚本只是一个概念验证,表明它可以工作,查询中包含数据,因此不需要新表。
  • @gvLearner - cdhowie 是正确的。您需要的只是 sql 语句,而不是测试脚本。我已更改语句以更好地反映它们是分开的(重命名表)。
  • 让我们说如果我想添加引用另一个表的另一列我该怎么办?例如:在这里,如果我想从表 desc 中添加另一个字段,链接 Id 字段。
  • @gvLearner - 查找 JOIN 语法。您可以通过连接来组合两个表。
【解决方案2】:

这有点令人费解,但应该可以解决问题:

select distinct x.id, x.value
  from table x
 where x.value is not null 
    or not exists 
       (select y.id 
          from table y 
         where y.id = x.id 
           and y.value is not null)

【讨论】:

    猜你喜欢
    • 2021-03-24
    • 1970-01-01
    • 1970-01-01
    • 2021-02-23
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多