Filtrer les lignes contenant des valeurs NULL uniquement lorsqu'une valeur a déjà une ligne avec une valeur NON NULLE

0

La question

Je suis à l'aide de SQL Server Management Studio 17.

J'ai une instruction select avec un groupe en qui renvoie les valeurs suivantes. C'est juste un sous-ensemble de 170 lignes.

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

J'ai du mal à trouver une instruction select qui filtre la première ligne. Si un enfant a déjà un parent qui n'est PAS NULL, alors je veux qu'il filtre la ligne avec la valeur NULL.

J'ai essayé de le résoudre avec un cas lorsque le comte de déclaration. Par exemple, si une valeur existe plus d'une fois dans l'enfant de la colonne puis je veux qu'il filtre la ligne où le parent est NULL, mais l'ensemble de mon code jusqu'à présent renvoie des erreurs.

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

La meilleure réponse

2

Vous pouvez utiliser existe de logique ici:

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

Démo

2021-11-23 09:55:57
0

Vous pouvez utiliser une fonction de fenêtre pour cela. Il peut être plus rapide ou plus lent que d'utiliser un EXISTS auto-jointure, vous avez besoin de tester

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

Dans d'autres langues

Cette page est dans d'autres langues

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