Filtragem de linhas com valores NULOS somente quando um valor já tem uma linha com um valor NULL NÃO

0

Pergunta

Eu estou usando o SQL Server Management Studio 17.

Eu tenho uma instrução select com um grupo que retorna os seguintes valores. Este é apenas um subconjunto de 170k linhas.

SELECT        child, parent
FROM            (SELECT child, parent
                          FROM table
                          GROUP BY child, parent) AS derivedtbl_1
ORDER BY child
Criança Pai
201 NULL
201 991
201 1020
202 NULL
203 NULL

Eu estou me esforçando para encontrar uma instrução select que filtra a primeira linha. Se uma criança já tem um pai que é NÃO NULO, então eu quero ele para filtrar a linha com o valor NULL.

Eu tentei resolver isso com um caso quando tendo a contagem de instrução. Por exemplo, se um valor existe mais de uma vez em que a criança coluna, em seguida, eu quero ele para filtrar a linha onde o pai é NULO, mas todas as minhas código até agora retorna erros.

Criança Pai
201 991
201 1020
202 NULL
203 NULL
sql sql-server
2021-11-23 09:48:35
2

Melhor resposta

2

Você pode usar existe lógica aqui:

SELECT child, parent
FROM yourTable t1
WHERE
    Parent IS NOT NULL OR
    (Parent IS NULL AND
     NOT EXISTS (SELECT 1 FROM yourTable t2
                 WHERE t2.Child = t1.Child AND
                       t2.Parent IS NOT NULL));

screen capture from demo link below

Demonstração

2021-11-23 09:55:57
0

Você pode usar uma função de janela para isso. Ele pode ser mais rápido ou mais lento do que usar uma EXISTS auto-participar, você precisa testar

SELECT
  child,
  parent
FROM (
    SELECT
      child,
      parent,
      AnyParent = MAX(parent) OVER (PARTITION BY child)
    FROM [table]
    GROUP BY child, parent
) AS derivedtbl_1
WHERE AnyParent IS NOT NULL;
ORDER BY child
2021-11-23 17:28:56

Em outros idiomas

Esta página está em outros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................