Filtrarea rânduri cu valori NULE numai atunci când o valoare are deja un rând, cu o valoare nenulă

0

Problema

Eu sunt, folosind SQL Server Management Studio 17.

Am un select cu un grup de care returnează următoarele valori. Acesta este doar un subset de 170k rânduri.

SELECT        child, parent
FROM            (SELECT child, parent
                          FROM table
                          GROUP BY child, parent) AS derivedtbl_1
ORDER BY child
Copil Părinte
201 NULL
201 991
201 1020
202 NULL
203 NULL

Eu sunt luptă pentru a găsi o instrucțiune select care filtrează primul rând. Dacă un copil are deja un părinte care NU este NULL, atunci vreau să filtreze rândul cu valoarea NULL.

Am încercat să o rezolve cu un caz când avea declarație nr. De exemplu, dacă există o valoare mai mult decât o dată în copil coloana apoi vreau să filtra rând în cazul în care părintele este NUL, dar tot de codul meu de până acum se întoarce erori.

Copil Părinte
201 991
201 1020
202 NULL
203 NULL
sql sql-server
2021-11-23 09:48:35
2

Cel mai bun răspuns

2

Puteți folosi există logica aici:

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

Puteți utiliza o funcție fereastră pentru acest lucru. Acesta poate fi mai rapid sau mai lent decât folosind un EXISTS auto-alăturați-vă, aveți nevoie pentru a testa

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

În alte limbi

Această pagină este în alte limbi

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