【问题标题】:How can I prevent all Null values from being returned in this TSQL?如何防止在此 TSQL 中返回所有 Null 值?
【发布时间】:2016-01-27 17:26:36
【问题描述】:

我有这个 TSQL:

SELECT Invd.Unit, M.MemberName, Invd.Description
FROM InvoiceDetail Invd
LEFT JOIN Members M on Invd.MemberNo = M.MemberNo
GROUP BY Invd.Unit, M.MemberName, Invd.Description

...这适用于 90% 的返回内容(除了非常缓慢),但大约 10% 的返回记录包含 Invd.Unit 或 M.MemberName 或两者的 Null 值。

我只想要任何地方都没有 Null 的记录。我需要做些什么来防止结果集中返回具有任何空值的记录?

我不想使用这样的东西:

SELECT IsNull(Invd.Unit, 'no Unit'), IsNull(M.MemberName, 'no Member Name'), Invd.Description
. . .

我根本不想要那些记录;我只想要这三个字段的唯一/不同组合(不包括其中任何一个字段中的空值 - 数据仅在所有三个值都存在的情况下才有用)。

【问题讨论】:

  • 如果您实际上没有计算聚合值,那么 DISTINCT 会比 GROUP BY,IMO 更清晰。
  • 不,没有进行计算;只是这三个字段的唯一组合的列表。

标签: sql sql-server tsql null isnull


【解决方案1】:

使用Where 条件将LEFT Join 更改为INNER Join

SELECT Invd.unit, 
       M.membername, 
       Invd.description 
FROM   invoicedetail Invd 
       INNER JOIN members M 
               ON Invd.memberno = M.memberno 
WHERE  Invd.unit IS NOT NULL 
       AND M.membername IS NOT NULL 
       AND Invd.description IS NOT NULL 
GROUP  BY Invd.unit, 
          M.membername, 
          Invd.description 

正如 cmets 中提到的,最好使用Distinct 而不是Group by,这样可以明确意图。当Select 中没有Aggregate 时,Sql 服务器足够智能,可以将group by 转换为distinct

【讨论】:

  • 我猜Group By在这里是用来去除重复的
  • @VR46: Claro que si.
  • 我认为 DISTINCT() 只能在一列上完成。
  • @B.ClayShannon DISTINCT 适用于行,而不是单个列。
猜你喜欢
  • 2013-10-24
  • 2014-09-08
  • 2013-08-22
  • 2014-12-22
  • 1970-01-01
  • 2019-02-07
  • 2013-02-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多