Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Połączenie stringów w nazwie tabeli
Forum PHP.pl > Forum > Bazy danych > Oracle
TomASS
Cześć,

Mam bazę danych, w której co miesiąc tworzona jest nowa tabela:
pl_201101 w styczniu
pl_201102 w lutym

itd.


chciałbym pobierać dane zawsze z najnowszej tabeli. Mogę pobrać rok oraz miesiąc z aktualnej daty
  1. SELECT to_char(sysdate,'YYYY') FROM dual


ale zaciąłem się na łączeniu stringów w nazwie tabeli:
  1. SELECT * FROM CONCAT('pl_','201110') B
niestety nie działa sad.gif
wookieb
Nazwa tabeli nie może być dynamiczna. Koniec kropka.
Crozin
Podstawowe pytanie to czemu nie masz jednej tabeli "pl", a niej kolumny z datą?
luckyps
Pozostaje Ci napisanie funkcji.
Niktoś
Wydaje mi się,że rozwiązanie Crozina jest lepsze.
wookieb
Ech gadanie od rzeczy. @Niktoś nie nabijaj postów
@TomASS Wygeneruj po prostu zapytanie w php. Inaczej tego nie zrobisz.
TomASS
Cześć. Dzięki za info.
@Crozin:
Cytat
Podstawowe pytanie to czemu nie masz jednej tabeli "pl", a niej kolumny z datą?

Niestety nie moja baza danych. Przewiduję (nie chcę aby dyskusja o tym rozwinęła się w tym temacie), że każda z tabel ma około 22 mln rekordów.

@wookieb:
Cytat
Wygeneruj po prostu zapytanie w php. Inaczej tego nie zrobisz.

Niestety - php nie ma nic z tym wspólnego. Aplikacja czyta zapytanie z pliku txt i dane wyrzuca na serwer. Moim zadaniem jest napisać tylko zapytanie (zmiana co miesiąc jest bardzo kłopotliwa)
stevan
Tak naprawdę może najprostsze rozwiązanie jest najlepsze. A mianowicie piszesz zapytanie które będzie obsługiwało te tabele przez określony czas np 2 lata. Tak naprawdę to tylko kopiuj, wklej z drobnymi zmianami. W zapytaniu uzależnij odczytanie tabeli od aktualnej daty wykorzystując chociażby instrukcję IF. Proste ale powinno działać smile.gif...
TomASS
Cytat(stevan @ 14.11.2011, 22:16:19 ) *
Tak naprawdę może najprostsze rozwiązanie jest najlepsze. A mianowicie piszesz zapytanie które będzie obsługiwało te tabele przez określony czas np 2 lata. Tak naprawdę to tylko kopiuj, wklej z drobnymi zmianami. W zapytaniu uzależnij odczytanie tabeli od aktualnej daty wykorzystując chociażby instrukcję IF. Proste ale powinno działać smile.gif...

Czy w samym zapytaniu mogę to zrobić? Tzn użyć IF?
stevan
Tworzysz skrypcik IF SYSDATE tutaj warunek THEN SELECT nazwa_tabeli...... END IF. i powielasz zmieniając warunek i nazwę tabeli.
TomASS
Cytat(stevan @ 14.11.2011, 22:56:39 ) *
Tworzysz skrypcik IF SYSDATE tutaj warunek THEN SELECT nazwa_tabeli...... END IF. i powielasz zmieniając warunek i nazwę tabeli.


A będzie to traktowane jako jedno zapytanie, czy skrypt muszę zrobić w jakiejś aplikacji?
Mogę tylko modyfikować plik *.txt z zapytaniem.
stevan
Tworzysz plik tekstowy i zmieniasz rozszerzenie na SQL... tyle
TomASS
czyli coś takiego:



  1. IF (sysdate>=2011-01-01 AND sysdate<=2011-01-31) THEN SELECT * FROM pl_201101
  2. ELSIF (sysdate>=2011-02-01 AND sysdate<=2011-02-28) THEN SELECT * FROM pl_201102
  3. ELSIF (sysdate>=2011-03-01 AND sysdate<=2011-03-31) THEN SELECT * FROM pl_201103
  4. ELSIF (sysdate>=2011-04-01 AND sysdate<=2011-04-30) THEN SELECT * FROM pl_201104
  5. ELSIF (sysdate>=2011-05-01 AND sysdate<=2011-05-31) THEN SELECT * FROM pl_201105
  6. ELSIF (sysdate>=2011-06-01 AND sysdate<=2011-06-30) THEN SELECT * FROM pl_201106
  7. END IF;


?
stevan
Ja bym to zrobił tak
IF (sysdate>=2011-01-01 AND sysdate<=2011-01-31) THEN SELECT * FROM pl_201101 END IF;
IF (sysdate>=2011-02-01 AND sysdate<=2011-02-28) THEN SELECT * FROM pl_201102 END IF;
itd....
everth
A z drugiej strony - gdybyś tak z wszystkich tabel zbudował jedną (np. UNION ALL) zapisał ją jako widok i pobierał z niego tylko potrzebne wiersze. Na oko wygląda prościej - ciekawe jakby to wyglądało w praniu wink.gif
TomASS
Cytat(everth @ 14.11.2011, 23:26:33 ) *
A z drugiej strony - gdybyś tak z wszystkich tabel zbudował jedną (np. UNION ALL) zapisał ją jako widok i pobierał z niego tylko potrzebne wiersze. Na oko wygląda prościej - ciekawe jakby to wyglądało w praniu wink.gif

A skąd mam wiedzieć co to jest "wszystkie tabele" - w styczniu będzie tylko pl_201101 w marcu już pl_201101 + pl_201102 + pl_201103 :/
everth
Mogę się mylić. bo jak zwykle nie zwróciłem uwagi na działy (Oracle) - potraktuj więc to co piszę z dużą dozą nieufności smile.gif. Przegapiłem też to
Cytat
chciałbym pobierać dane zawsze z najnowszej tabeli. Mogę pobrać rok oraz miesiąc z aktualnej daty

W takim wypadku utworzenie widoku i odwoływanie się przez niego do tabeli także może być prostsze. Po prostu co miesiąc wraz z utworzeniem nowej (aktualnej) tabeli aktualizujesz widok. Może to robić ta aplikacja co, co miesiąc wrzuca dane na serwer.
Niktoś
Druga kombinacja trochę alpejska-utworzyć w plik txt dodatkową kwerende odczytującą nazwy tabel możnaby użyć w niej klauzulę like %pl_ żeby nieco ograniczyć zakres do interesujących nas tabel.
Z kwerendy tej odczytujemy nazwy przykładowo pl_201101 pl_201102 i z pomocą np. wyrażenia regularnego wyciągamy liczby i patrzymy ,która liczba jest większa.Z wyrazu gdzie liczba jest największa używamy w zapytaniu -aby pobrać interesujące nas dane z tejże tabeli.
TomASS
Cytat(everth @ 15.11.2011, 02:21:56 ) *
Mogę się mylić. bo jak zwykle nie zwróciłem uwagi na działy (Oracle) - potraktuj więc to co piszę z dużą dozą nieufności smile.gif. Przegapiłem też to

W takim wypadku utworzenie widoku i odwoływanie się przez niego do tabeli także może być prostsze. Po prostu co miesiąc wraz z utworzeniem nowej (aktualnej) tabeli aktualizujesz widok. Może to robić ta aplikacja co, co miesiąc wrzuca dane na serwer.

Modyfikacja aplikacji niestety nie wchodzi w grę :/


Cytat(Niktoś @ 15.11.2011, 02:49:44 ) *
Druga kombinacja trochę alpejska-utworzyć w plik txt dodatkową kwerende odczytującą nazwy tabel możnaby użyć w niej klauzulę like %pl_ żeby nieco ograniczyć zakres do interesujących nas tabel.
Z kwerendy tej odczytujemy nazwy przykładowo pl_201101 pl_201102 i z pomocą np. wyrażenia regularnego wyciągamy liczby i patrzymy ,która liczba jest większa.Z wyrazu gdzie liczba jest największa używamy w zapytaniu -aby pobrać interesujące nas dane z tejże tabeli.

Nie mam dostępu do tabeli systemowej z nazwami tabel :/
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.