Dodawanie nowych wierszy (wartość NULL) w hierarchii z kilkoma nadrzędnymi elementami potomnymi.

0

Pytanie

Mam hierarchia z kilkoma nadrzędnymi elementami podrzędnymi, składająca się z ponad 100 tysięcy rekordów. To mały podzbiór.

Dziecko Rodzic
1 2
1 3
2 3

Muszę zobaczyć każdą wartość z nadrzędnego kolumny i sprawdź czy jest takie samo znaczenie i w podrzędnej kolumnie. Jeśli nie, to utwórz wiersz (wartość NULL). W tym przykładzie wartość 3 nie występuje w podrzędnym kolumnie, więc ja muszę do tworzenia nowego wiersza z wartościami (3, NULL).

Dziecko Rodzic
3 zero
1 2
1 3
2 3

Mój kod nie zwraca błąd, ale to nie sprawia, że to, co chcę.

INSERT IGNORE INTO #table (child, parent)
SELECT (CASE WHEN parent not in (Select child from #table) THEN parent END) as child, Null
FROM #table

Otrzymuję wiele nowych wierszy (NULL,NULL), ale 0 wierszy (wartość NULL). Musi on w jakiś sposób zawsze przejść do klauzuli else, kiedy pojawia się tak wiele nowych wierszy (NULL, NULL), ale nie jestem pewien, dlaczego.

Korzystanie z programu SQL Server Management Studio 17. Będziemy bardzo wdzięczni za każdą pomoc.

parent-child sql sql-server
2021-11-23 14:41:35
1

Najlepsza odpowiedź

1

Nie należy używać case tutaj, ale zamiast tego samodzielne lewe połączenie:

INSERT IGNORE INTO #table (child, parent)
SELECT DISTINCT t1.parent, NULL
FROM #table t1
LEFT JOIN #table t2
    ON t1.parent = t2.child
WHERE t2.child IS NULL

Zobacz demonstrację na Db<>Fiddle<>

2021-11-23 14:53:26

W innych językach

Ta strona jest w innych językach

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