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.
3

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.

3

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,@IncrementValue=@IncrementValue+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

0

Ostatecznie napisałem takie zapytanie:

update PL_ECP_HARMONOGRAMY B
set B.SWCP_ID = (select NOWY
                 from (select ID, MAKSIMUM + REKORD as NOWY
                       from (select ID, SWCP_ID, max(SWCP_ID) OVER(
                             order by 1) as MAKSIMUM, ROW_NUMBER() OVER(
                             order by SWCP_ID) as REKORD
                             from PL_ECP_HARMONOGRAMY
                             order by ID) as C))
where B.ID = C.ID;

Ale teraz wywala mi taki komunikat:

can't format message 13:794 -- message file C:\WINDOWS\SYSTEM32\firebird.msg not found.
Dynamic SQL Error.
SQL error code = -206.
Column unknown.
C.ID.
At line 9, column 14.

Mógłby ktoś spróbować zmierzyć się z tym zagadnieniem??
Z góry bardzo dziękuję za pomoc

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