sql获取列值,其中所有值在另一列中没有值

时间:2015-01-30 09:02:11

标签: sql sql-server

我有一个包含4列的数据库表:

列A - 必须具有值并允许重复
B栏 - 可能是空的 C栏 - 可能是空的 D栏 - 必须具有唯一值

示例

  A  |  B  |   C  |  D
  ---|-----|------|-------    
  a1 | b1  |   -  | 101  
  a1 | -   |  c1  | 102
  a1 | b2  |  -   | 103
  a2 | -   |  -   | 104 
  a2 | b3  |  -   | 105   
  a3 | b4  |  c2  | 106
  a3 | -   |  c3  | 107
  a3 | -   |  c4  | 108

我想要的是获取A列和B列值,其中对于A列中的值,C列中的所有记录都没有值。

在示例中,我想获得以下结果

 A    |    B 
------------- 
 a2   |
 a2   |    b3

2 个答案:

答案 0 :(得分:3)

抱歉,您的意思是所有a2值,因为没有a2行有C值?

select a, b
from tablename t1
where not exists (select 1 from tablename t2
                  where t1.a = t2.a
                  and c is not null)

答案 1 :(得分:0)

你能试试吗?

DECLARE @t TABLE
    (
      A CHAR(2) ,
      B CHAR(2) ,
      C CHAR(2) ,
      D INT
    )

INSERT  INTO @t
VALUES  ( 'a1', 'b1', NULL, 101 ),
        ( 'a1', NULL, 'c1', 102 ),
        ( 'a1', 'b2', NULL, 103 ),
        ( 'a2', NULL, NULL, 104 ),
        ( 'a2', 'b3', NULL, 105 ),
        ( 'a3', 'b4', 'c2', 106 ),
        ( 'a3', NULL, 'c3', 107 ),
        ( 'a3', NULL, 'c4', 108 );
WITH    cte
          AS ( SELECT   t1.* ,
                        RANK() OVER ( PARTITION BY t1.A ORDER BY t1.C ) AS R
               FROM     @t t1
                        JOIN @t t2 ON t2.A = t1.A
             )
    SELECT  t.A ,
            t.B
    FROM    cte
            JOIN @t t ON t.A = cte.A
    GROUP BY t.A ,
            t.B
    HAVING  COUNT(DISTINCT ( R )) = 1

输出:

A   B
a2  NULL
a2  b3