Filtrování řádků s hodnotami NULL pouze tehdy, když hodnota již má řádek s NON hodnotu NULL

0

Otázka

Jsem pomocí SQL Server Management Studio 17.

Mám select s group by, která vrací následující hodnoty. To je jen podmnožinou 170k řádky.

SELECT        child, parent
FROM            (SELECT child, parent
                          FROM table
                          GROUP BY child, parent) AS derivedtbl_1
ORDER BY child
Dítě Rodič
201 NULL
201 991
201 1020
202 NULL
203 NULL

Já jsem usilovně se snaží najít select, který filtruje první řadě. Pokud dítě již má rodič, který nemá hodnotu NULL, pak chci, aby to odfiltrovat řádek s hodnotou NULL.

Snažil jsem se to vyřešit s případem, kdy se mají počítat prohlášení. Například pokud hodnota existuje více než jednou v dítěti sloupci pak chci, aby to odfiltrovat řádku, kde rodič je NULL, ale všechny moje kód tak daleko, vrací chyby.

Dítě Rodič
201 991
201 1020
202 NULL
203 NULL
sql sql-server
2021-11-23 09:48:35
2

Nejlepší odpověď

2

Můžete použít existuje logika zde:

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

Můžete použít okno funkce pro tento. To může být rychlejší nebo pomalejší než použití EXISTS self-join, budete muset vyzkoušet

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

V jiných jazycích

Tato stránka je v jiných jazycích

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