Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql获取列值,其中另一列中的所有值都没有值_Sql_Sql Server - Fatal编程技术网

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

sql获取列值,其中另一列中的所有值都没有值,sql,sql-server,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

我有一个包含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 
------------- 
 a2   |
 a2   |    b3
我想要的是得到A列和B列的值,其中A列中的值,C列中的所有记录都没有值

在本例中,我希望得到以下结果:

  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 
------------- 
 a2   |
 a2   |    b3

对不起,您是指所有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)
你能试试这个吗

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

其中A不为空,C为空,但A列中有相同的值。我希望所有C列都没有值。@juergend我相信,如果你能更清楚地解释一下你想要什么,你会很快得到答案。请你再详细阐述一下你的最后一句话,让我们了解一下实际需求……嗨,我只想要a2值,如果没有a2行具有jarlh的答案中提到的C值,很抱歉描述不清楚。谢谢,你好,贾尔赫,谢谢。是的,你的理解是正确的,但我只有一张桌子。@MapleLi只有一张桌子是正确的used@MapleLi,是的,它在主查询和子选择中都是同一个表。嗨,Giorgi Nakeuri,太棒了!它得到了正确的答案。但是,如何从一个具有数千条记录的现有表中执行相同的操作呢?非常感谢。