Filtrare le righe con valori NULL solo quando un valore già ha una riga con un valore NULL NON

0

Domanda

Sto utilizzando SQL Server Management Studio 17.

Ho una select con un gruppo che restituisce i seguenti valori. Questo è solo un sottoinsieme di 170k righe.

SELECT        child, parent
FROM            (SELECT child, parent
                          FROM table
                          GROUP BY child, parent) AS derivedtbl_1
ORDER BY child
Bambino Padre
201 NULL
201 991
201 1020
202 NULL
203 NULL

Ho difficoltà a trovare un'istruzione select che filtra la prima riga. Se un bambino ha già un padre che NON è NULL, quindi voglio filtrare la riga con il valore NULL.

Ho provato a risolvere con un caso in cui avendo conteggio economico. Per esempio, se un valore è presente più di una volta nel bambino colonna poi voglio filtrare la riga in cui il padre è NULL, ma tutto il mio codice finora restituisce errori.

Bambino Padre
201 991
201 1020
202 NULL
203 NULL
sql sql-server
2021-11-23 09:48:35
2

Migliore risposta

2

Si può utilizzare esiste la logica qui:

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

Demo

2021-11-23 09:55:57
0

È possibile utilizzare una funzione di finestra per questo. Può essere più veloce o più lento rispetto all'utilizzo di un EXISTS self-join, è necessario verificare

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

In altre lingue

Questa pagina è in altre lingue

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