Autor Téma: Udate tabuľky  (Přečteno 716 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7424
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Udate tabuľky
« kdy: 18-12-2022, 19:22:10 »
Chcem jednorazovo prečíslovať byty. Jedná sa o 4 500 záznamov. Rád by som to urobil v DB manažéri, ale neviem ako.
Viem to urobiť v D.
  • Spustím "SELECT"
  • v cykle prechádzam DataSet
  • postupne vykonám UPDATE
Kód: [Vybrat]
UPDATE FLATS SET FLATNUMBER = NEWNUMBER Zo SELECT
.
SELECT ... , ... ,
  CASE
    WHEN SUBSTRING(E.TITLE FROM 1 FOR 3) = 'V02' THEN F.FLATNUMBER + 75
    WHEN SUBSTRING(E.TITLE FROM 1 FOR 3) = 'V03' THEN F.FLATNUMBER + 150
    WHEN SUBSTRING(E.TITLE FROM 1 FOR 3) = 'V04' THEN F.FLATNUMBER + 225
    ELSE F.FLATNUMBER
  END AS NEWNUMBER
FROM FLATS F
  INNER JOIN ENTRIES E ON F.FKENTRY = E.IDENTRIES
  INNER JOIN FOCS FO ON E.FKFOCS = FO.IDFOCS
Ak to nepôjde ináč, tak si to jedno tlačidlo hodím na hlavný formulár.
Win11 64b, Delphi 12.2, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline vandrovnik

  • Padawan
  • ******
  • Příspěvků: 1586
  • Karma: 52
    • Verze Delphi: 11.3
Re:Udate tabuľky
« Odpověď #1 kdy: 18-12-2022, 21:18:17 »

Offline Jan Fiala

  • Hrdina
  • ****
  • Příspěvků: 448
  • Karma: 6
    • Verze Delphi: 10.4.1
    • PSPad editor
Re:Udate tabuľky
« Odpověď #2 kdy: 19-12-2022, 06:36:14 »
Excellent
Rated 1 time
Muzes primo v Update pouzit CASE a udelat to najednou bez prochazeni.
Kód: [Vybrat]
UPDATE F SET FLATNUMBER =
  CASE
    WHEN SUBSTRING(E.TITLE FROM 1 FOR 3) = 'V02' THEN F.FLATNUMBER + 75
    WHEN SUBSTRING(E.TITLE FROM 1 FOR 3) = 'V03' THEN F.FLATNUMBER + 150
    WHEN SUBSTRING(E.TITLE FROM 1 FOR 3) = 'V04' THEN F.FLATNUMBER + 225
    ELSE F.FLATNUMBER
  END
FROM FLATS F
  INNER JOIN ENTRIES E ON F.FKENTRY = E.IDENTRIES
  INNER JOIN FOCS FO ON E.FKFOCS = FO.IDFOCS

Offline vandrovnik

  • Padawan
  • ******
  • Příspěvků: 1586
  • Karma: 52
    • Verze Delphi: 11.3
Re:Udate tabuľky
« Odpověď #3 kdy: 19-12-2022, 08:54:23 »
A tuhle syntaxi Firebird umí?

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7424
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Re:Udate tabuľky
« Odpověď #4 kdy: 19-12-2022, 09:27:14 »
A tuhle syntaxi Firebird umí?
Ja som presvedčený, že nie. Preto som to ani neskúsil. V minulosti som skúsil niečo jednoduchšie a nepochodil som.
Tak som to vyskúšal. Padne to na FROM.
Win11 64b, Delphi 12.2, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3527
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Udate tabuľky
« Odpověď #5 kdy: 19-12-2022, 10:16:55 »
A tuhle syntaxi Firebird umí?
Jestli si to pamatuju, tak jsem pouzival normalne UPDATE ... WHERE id IN SELECT ...

Offline Jan Fiala

  • Hrdina
  • ****
  • Příspěvků: 448
  • Karma: 6
    • Verze Delphi: 10.4.1
    • PSPad editor
Re:Udate tabuľky
« Odpověď #6 kdy: 19-12-2022, 12:42:51 »
A tuhle syntaxi Firebird umí?

Podle tohoto (od 2.5) ano:
https://stackoverflow.com/questions/7633195/firebird-update-rows-value-in-table-basing-on-some-condition
« Poslední změna: 19-12-2022, 12:44:35 od Jan Fiala »

Offline vandrovnik

  • Padawan
  • ******
  • Příspěvků: 1586
  • Karma: 52
    • Verze Delphi: 11.3
Re:Udate tabuľky
« Odpověď #7 kdy: 19-12-2022, 12:47:43 »
A tuhle syntaxi Firebird umí?

Podle tohoto (od 2.5) ano:
https://stackoverflow.com/questions/7633195/firebird-update-rows-value-in-table-basing-on-some-condition

Mně to nešlo, ani podle dokumentace se mi to moc nezdá.
Určitě jde udělat něco jako
UPDATE FLATS F SET F.FLATNUMBER = (SELECT ...)
ale pokud jsou pak podmínky nějaké košatější, připadá mi lepší ten blok.

Offline Jan Fiala

  • Hrdina
  • ****
  • Příspěvků: 448
  • Karma: 6
    • Verze Delphi: 10.4.1
    • PSPad editor
Re:Udate tabuľky
« Odpověď #8 kdy: 19-12-2022, 14:08:48 »
Jsem rozmlsany z MS SQL  :-(

Offline František

  • Guru
  • *****
  • Příspěvků: 910
  • Karma: 8
    • Verze Delphi: comunity 10.4.2, D2007, D11
Re:Udate tabuľky
« Odpověď #9 kdy: 20-12-2022, 18:32:13 »
nechapem preco to neupdatnes na 3x jednoduchym UPDATE .. set  ... where

ale neskusal som to
Kód: [Vybrat]
UPDATE FLATS F SET f.FLATNUMBER = 75
where F.FKENTRY = (select E.IDENTRIES from ENTRIES E
 INNER JOIN FOCS FO ON E.FKFOCS = FO.IDFOCS
where SUBSTRING(E.TITLE FROM 1 FOR 3) =  'V02')

...
« Poslední změna: 20-12-2022, 18:54:47 od František »

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7424
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Re:Udate tabuľky
« Odpověď #10 kdy: 20-12-2022, 19:31:50 »
Nevadí, že nechápeš :D  Ja som to v podstate okamžite urobil v D. Ďalej to tu už bola skôr akademická debata. Ale niečo ma naučila. Ten cyklus zbehol skôr, ako som stačil kliknúť na tlačidlo.
Win11 64b, Delphi 12.2, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.