Zapytanie update zwiększające numer wybranego pola każdego wiersza o 1

0

Witam. Przeczesałem wiele foròw i nie znalazłem odpowiedzi na mój problem. Proszę o pomoc w zapytaniu w dwóch wariantach:

  1. Część wierszy z wybranym polem jest ponumerowana narastająco, a druga część ma wartość null. Zapytanie ma znaleźć max numer w tym polu i ponumerować nulle do końca, zwiększając o 1.
  2. Wszystkie wiersze mają wartość null. Zapytanie powinno ponumerować o 1 kolejne wiersze. Z góry dzięki za pomoc.
    Silnik Firebird.
2

No i na czym problem polega? Co nie wychodzi? To ma być jedno zapytanie dla opcji ( czyli to zadanie domowe |)? Czy to realny problem do rozwiązania i nie musi być jednego zapytania?

0
katakrowa napisał(a):

No i na czym problem polega? Co nie wychodzi? To ma być jedno zapytanie dla opcji ( czyli to zadanie domowe |)? Czy to realny problem do rozwiązania i nie musi być jednego zapytania?

Tak problem jest realny. Dane tutaj nie mają znaczenia, bo myślę że to zapytanie można potraktować jako uniwersalne. Tak zapytanie ma być w dwóch wariantach.

2

Dlaczego dla punktu 1 musi być jedno zapytanie a nie np. coś w stylu:

DECLARE @IncrementValue int
SET @IncrementValue = 0 
UPDATE Samples SET qty = @IncrementValue,@[email protected]+1
WHERE qty is NULL
1

Pamiętam, że jak pracowałem na Firebirdzie, to bardziej złożone update'y musiałem ogarniać procedurami, bo FB nie ma UPDATE FROM (a przynajmniej nie miał za moich czasów).

W TSQL wyglądałoby to tak:

UPDATE t
SET t.kolumna = isnull(m.maxwart, 0) + t.nowa
FROM (
  SELECT max(kolumna) maxwart
  FROM tabela
  ) m
JOIN (
  SELECT row_number() OVER (
      ORDER BY kolumna
      ) nowa
    , kolumna
  FROM tabela
  WHERE kolumna IS NULL
  ) t ON 1 = 1

Jednym zapytaniem tego na pewno nie zrobisz w Firebirdzie. Chyba, że stworzysz sobie generator, któremu przypiszesz wartość maksymalną ze swojej kolumny, po czym użyjesz generatora do nadpisania wszystkich nulli.

Nasuwa się jednak jedno pytanie - dlaczego tam występują nulle, skoro są niepożądane?

0
Fac napisał(a):

Pamiętam, że jak pracowałem na Firebirdzie, to bardziej złożone update'y musiałem ogarniać procedurami, bo FB nie ma UPDATE FROM (a przynajmniej nie miał za moich czasów).

W TSQL wyglądałoby to tak:

UPDATE t
SET t.kolumna = isnull(m.maxwart, 0) + t.nowa
FROM (
  SELECT max(kolumna) maxwart
  FROM tabela
  ) m
JOIN (
  SELECT row_number() OVER (
      ORDER BY kolumna
      ) nowa
    , kolumna
  FROM tabela
  WHERE kolumna IS NULL
  ) t ON 1 = 1

Jednym zapytaniem tego na pewno nie zrobisz w Firebirdzie. Chyba, że stworzysz sobie generator, któremu przypiszesz wartość maksymalną ze swojej kolumny, po czym użyjesz generatora do nadpisania wszystkich nulli.

Nasuwa się jednak jedno pytanie - dlaczego tam występują nulle, skoro są niepożądane?

Nulle występują, bo ta kolumna nie jest kluczem i nie ma zastrzeżenia że tam nie mogą być nulle. A pojawiły się tam, bo robiłem inserta, który nie miał tego pola zdefiniowanego.

0
Fac napisał(a):

Pamiętam, że jak pracowałem na Firebirdzie, to bardziej złożone update'y musiałem ogarniać procedurami, bo FB nie ma UPDATE FROM (a przynajmniej nie miał za moich czasów).

W TSQL wyglądałoby to tak:

UPDATE t
SET t.kolumna = isnull(m.maxwart, 0) + t.nowa
FROM (
  SELECT max(kolumna) maxwart
  FROM tabela
  ) m
JOIN (
  SELECT row_number() OVER (
      ORDER BY kolumna
      ) nowa
    , kolumna
  FROM tabela
  WHERE kolumna IS NULL
  ) t ON 1 = 1

Jednym zapytaniem tego na pewno nie zrobisz w Firebirdzie. Chyba, że stworzysz sobie generator, któremu przypiszesz wartość maksymalną ze swojej kolumny, po czym użyjesz generatora do nadpisania wszystkich nulli.

Nasuwa się jednak jedno pytanie - dlaczego tam występują nulle, skoro są niepożądane?

A moglibyśmy jeszcze raz przeanalizować ten przypadek??. Bo nie wiem, czy dobrze zrozumiałem, to zapytanie, które wypisałeś. Natomiast aby było łatwiej, to będę opierał się na realnych wartościach.
Mam taką tabelę jak na zrzucie. W tym momencie wszystkie wiersze poza jednym z pola swcp_id, to są nulle. Teraz właśnie jak przełożyć to twoje zapytanie, tak żeby updetować te nulle, tak żeby od wartości dla swcp_id = 1065 zwiększyć wszystko o 1.
screenshot-20201022224456.png

A drugi wariant, żeby zacząć również od 1065, jeśli wszyskie wiersze są nullami:

screenshot-20201022224634.png

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0