SQL(TSQL)-在另一列不为空的列中选择值?

SQL(TSQL)-在另一列不为空的列中选择值?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我将保持这个简单-我想知道是否有一个好方法来选择一列中的所有值,当它在另一列中从来没有空值时。比如说 A B ----- ----- 1 7 2 7 NULL 7 4 9 1 9 2 9 从上面的集合中,我只想从B中得到9,而不是7,因为7在a中有一个NULL。显然,我可以将其包装为子查询并使用in子句等。但这已经是一个非常独特集合的一部分,我希望保持这一效率 我应该注意到,就我的目的而言,这只是一

我将保持这个简单-我想知道是否有一个好方法来选择一列中的所有值,当它在另一列中从来没有空值时。比如说

  A      B
-----  -----

  1      7
  2      7
NULL     7
  4      9
  1      9
  2      9
从上面的集合中,我只想从B中得到9,而不是7,因为7在a中有一个NULL。显然,我可以将其包装为子查询并使用in子句等。但这已经是一个非常独特集合的一部分,我希望保持这一效率

我应该注意到,就我的目的而言,这只是一个单向比较。。。我将只返回B中的值并检查A


我想有一种简单的方法可以做到这一点,但我现在还不知道,因为我身在一大堆事情中。

你可以这样做:

select *
from t
where t.b not in (select b from t where a is null);
如果只需要不同的b值,则可以执行以下操作:

select b
from t
group by b
having sum(case when a is null then 1 else 0 end) = 0;
最后,您可以使用窗口函数:

select a, b
from (select t.*,
             sum(case when a is null then 1 else 0 end) over (partition by b) as NullCnt
      from t
     ) t
where NullCnt = 0;

下面的查询将在最终结果中只输出一列。记录按列
B
分组,并测试记录是否为空。当记录为空时,组的值将每次递增1。
HAVING
子句仅过滤值为
0
的组

SELECT  B
FROM    TableName
GROUP   BY B
HAVING  SUM(CASE WHEN A IS NULL THEN 1 ELSE 0 END) = 0
如果要从记录中获取所有行,可以使用join

SELECT  a.*
FROM    TableName a
        INNER JOIN
        (
            SELECT  B
            FROM    TableName
            GROUP   BY B
            HAVING  SUM(CASE WHEN A IS NULL THEN 1 ELSE 0 END) = 0
        ) b ON  a.b = b.b

第二个例子对我来说非常有效!我应该注意到,所有这些都是避免关系分裂的一部分。