Autor Téma: Pomoc s SQL  (Přečteno 586 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7384
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Pomoc s SQL
« kdy: 27-09-2023, 13:49:05 »
Mám tabuľku
Kód: [Vybrat]
CREATE TABLE MATCHES
(
  MATCHID              PRIMARYKEY,
  ROUNDFK          FOREINGKEYNULL,
  STADIUMFK        FOREINGKEYNULL,
  TEAM1FK              FOREINGKEY,
  TEAM2FK              FOREINGKEY,
  INTABLE                    BOOL,
  DATES                     DATES,
  GROUPNR                 INT_VAL,
  REMATCH                    BOOL,
  WINNER                  INT_VAL,
  VISITORS                INT_VAL,
  NOTE                    MEMO500,
  GOAL1                   INT_VAL DEFAULT 0 NOT NULL,
  GOAL2                   INT_VAL DEFAULT 0 NOT NULL,
  WINNERTEAM       FOREINGKEYNULL,
  TAG                     INT_VAL,...
Potrebujem k TEAM1FK A TEAM2FK dostať aktuálne názvy/skratky. Pre jeden Team to nie je problém. Akonáhle to urobím pre oba tými, tak dopyt trvá 1 min a viac. Je jedno či použijem WITH, VIEW alebo akúkoľvek inú techniku.
Kód: [Vybrat]
WITH
  TN1 AS (SELECT MAX(N.DATEFROM) AS DATEFROM, N.TEAMFK, N.TEAMNAMEID
    FROM TEAM_NAMES N
    WHERE N.TEAMFK > 0 AND EXTRACT(YEAR FROM N.DATEFROM) <= 2006 AND ((EXTRACT(YEAR FROM N.DATETO) >= 2006) OR
       (N.DATETO IS NULL))
    GROUP BY N.TEAMFK, N.TEAMNAMEID)
SELECT N1.ACRONYM AS TITLE2, N2.ACRONYM, M.GOAL2, M.GOAL1, M.REMATCH, M.DATES
FROM MATCHES M
  INNER JOIN TEAM_NAMES N1 ON N1.TEAMFK = M.TEAM1FK
  INNER JOIN TN1 ON TN1.TEAMFK = N1.TEAMFK AND TN1.DATEFROM = N1.DATEFROM
  INNER JOIN TEAM_NAMES N2 ON N2.TEAMFK = M.TEAM2FK
  INNER JOIN TN1 TN2 ON TN2.TEAMFK = N2.TEAMFK AND TN2.DATEFROM = N2.DATEFROM
WHERE M.ROUNDFK = 10568 AND M.GROUPNR = 1
Ako sa to dá vyriešiť?
Win11 64b, Delphi 11.3.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7384
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Re:Pomoc s SQL
« Odpověď #1 kdy: 27-09-2023, 14:19:08 »
Samozrejme, že mi prišlo na um ešte jedno funkčné riešenie.
Podmienku pre rok som dal samostatne pre N1 a N2. Samozrejme, že WITH som vyhodil.
Ďakujem.
Win11 64b, Delphi 11.3.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline Jan Fiala

  • Hrdina
  • ****
  • Příspěvků: 438
  • Karma: 6
    • Verze Delphi: 10.4.1
    • PSPad editor
Re:Pomoc s SQL
« Odpověď #2 kdy: 03-10-2023, 14:49:01 »
Na prirazeni jmen bych pouzil outer join, ne inner join
Tu podminku na datum muzes dat rovnou do podminky za join

Pak z toho mas jednoduchy dotaz

Kód: [Vybrat]
SELECT N1.ACRONYM AS TITLE2, N2.ACRONYM, M.GOAL2, M.GOAL1, M.REMATCH, M.DATES
FROM MATCHES M
  LEFT OUTER JOIN TEAM_NAMES N1 ON N1.TEAMFK = M.TEAM1FK AND EXTRACT(YEAR FROM N1.DATEFROM) <= 2006 AND ((EXTRACT(YEAR FROM N1.DATETO) >= 2006) OR
       (N1.DATETO IS NULL))
  LEFT OUTER JOIN TEAM_NAMES N2 ON N2.TEAMFK = M.TEAM2FK AND EXTRACT(YEAR FROM N2.DATEFROM) <= 2006 AND ((EXTRACT(YEAR FROM N2.DATETO) >= 2006) OR
       (N2.DATETO IS NULL))
WHERE M.ROUNDFK = 10568 AND M.GROUPNR = 1

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7384
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Re:Pomoc s SQL
« Odpověď #3 kdy: 03-10-2023, 15:33:55 »
Ďakujem. Preštudujem si to. Aby som to pochopil a v prípade vhodnej situácie to použil.
Svoje riešenie už nebudem prerábať.
Win11 64b, Delphi 11.3.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.