Отфильтровывание wierszy z wartościami zerowymi tylko w przypadku, jeśli wartość zawiera już wiersz z NIEZEROWYM

0

Pytanie

Używam SQL Server Management Studio 17.

Mam instrukcję select z grupą by, która zwraca następujące wartości. To tylko podzbiór 170 tysięcy wierszy.

SELECT        child, parent
FROM            (SELECT child, parent
                          FROM table
                          GROUP BY child, parent) AS derivedtbl_1
ORDER BY child
Dziecko Rodzic
201 zero
201 991
201 1020
202 zero
203 zero

Ja ze wszystkich sił staram się znaleźć instrukcję select, która filtruje pierwszy wiersz. Jeśli dziecko ma już rodzic, który NIE jest ZEROWY, chcę, aby on odfiltrowane wiersz z wartością NULL.

Próbowałem rozwiązać ten problem z pomocą sytuacji, gdy mam instrukcję count. Na przykład, jeśli wartość istnieje więcej niż jeden raz w podrzędnej kolumnie, chcę, aby ono отфильтровывало wiersz, w którym rodzic jest równy ZERO, ale cały mój kod do tej pory zwraca błąd.

Dziecko Rodzic
201 991
201 1020
202 zero
203 zero
sql sql-server
2021-11-23 09:48:35
2

Najlepsza odpowiedź

2

Można użyć istniejącej logiki tutaj:

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

DEMONSTRACJA

2021-11-23 09:55:57
0

Do tego można użyć funkcji okna. To może być szybciej lub wolniej, niż przy użyciu EXISTS samodzielne przystąpienie, trzeba przetestować

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

W innych językach

Ta strona jest w innych językach

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