Skomplikowane zapytanie do bazy danych - Insert i wiele selectów

Skomplikowane zapytanie do bazy danych - Insert i wiele selectów
PO
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 2 lata
  • Postów:29
0

Mam bazę danych, do której obsługi dorobiłem interface w javie. Przede mną ostani krok - chyba najtrudniejszy. Program rozlicza obecności pracowników. Jest tabela grafik pozwalająca wpisać bieżacy stan i tabel rozliczenie generująca podsumowanie. Do podsumowania dane są przekazywane przez kod, który zamieszczam poniżej.

Kopiuj
INSERT INTO rozliczenie(id_pracow, liczba_dni_przepracowanych, liczba_dni_nieobecnosci, liczba_dni_urlopu, liczba_dni_choroby)
VALUES
((SELECT id_pracownika FROM pracownicy WHERE imie='Bogdan' AND nazwisko='Nowak' ),(SELECT COUNT(*) FROM grafik WHERE status='1' AND id_pracownika='1' AND czy_rozliczony='0' ),(SELECT COUNT(*) FROM grafik WHERE status='2' AND id_pracownika='1' AND czy_rozliczony='0'),(SELECT COUNT(*) FROM grafik WHERE status='3' AND id_pracownika='1'AND czy_rozliczony='0'),(SELECT COUNT(*) FROM grafik WHERE status='4' AND id_pracownika='1' AND czy_rozliczony='0')),

((SELECT id_pracownika FROM pracownicy WHERE imie='Cezary' AND nazwisko='Kowalski'),(SELECT COUNT(*) FROM grafik WHERE status='1' AND id_pracownika='2'AND czy_rozliczony='0'),(SELECT COUNT(*) FROM grafik WHERE status='2' AND id_pracownika='2' AND czy_rozliczony='0'),(SELECT COUNT(*) FROM grafik WHERE status='3' AND id_pracownika='2' AND czy_rozliczony='0'),(SELECT COUNT(*) FROM grafik WHERE status='4' AND id_pracownika='2' AND czy_rozliczony='0')),

((SELECT id_pracownika FROM pracownicy WHERE imie='Anna' AND nazwisko='Pawlak' ),(SELECT COUNT(*) FROM grafik WHERE status='1' AND id_pracownika='3' AND czy_rozliczony='0'),(SELECT COUNT(*) FROM grafik WHERE status='2' AND id_pracownika='3' AND czy_rozliczony='0'),(SELECT COUNT(*) FROM grafik WHERE status='3' AND id_pracownika='3' AND czy_rozliczony='0'),(SELECT COUNT(*) FROM grafik WHERE status='4' AND id_pracownika='3' AND czy_rozliczony='0')),

((SELECT id_pracownika FROM pracownicy WHERE imie='Agnieszka' AND nazwisko='Orlowska' ),(SELECT COUNT(*) FROM grafik WHERE status='1' AND id_pracownika='4' AND czy_rozliczony='0'),(SELECT COUNT(*) FROM grafik WHERE status='2' AND id_pracownika='4' AND czy_rozliczony='0'),(SELECT COUNT(*) FROM grafik WHERE status='3' AND id_pracownika='4' AND czy_rozliczony='0'),(SELECT COUNT(*) FROM grafik WHERE status='4' AND id_pracownika='4' AND czy_rozliczony='0')),

((SELECT id_pracownika FROM pracownicy WHERE imie='Joanna' AND nazwisko='Tomczyk' ),(SELECT COUNT(*) FROM grafik WHERE status='1' AND id_pracownika='5' AND czy_rozliczony='0'),(SELECT COUNT(*) FROM grafik WHERE status='2' AND id_pracownika='5' AND czy_rozliczony='0'),(SELECT COUNT(*) FROM grafik WHERE status='3' AND id_pracownika='5' AND czy_rozliczony='0'),(SELECT COUNT(*) FROM grafik WHERE status='4' AND id_pracownika='5' AND czy_rozliczony='0'));

Chciałbym taką komendę móc umieścic w kodzie JDBC. Szukam w necie już drugi dzień i efektów zero. Czy ktoś mógłby podrzucić jakiś pomysł lub sugestię? Ten kod naprawdę działa w PGAdmin3.

__krzysiek85
  • Rejestracja:ponad 18 lat
  • Ostatnio:ponad 9 lat
  • Postów:1019
1

A nie możesz tego zapytania przepisać używając GROUP BY id_pracownika?


Registered Linux user #456405 | SCJP 6 | SCWCD 5 | SCBCD 5
PO
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 2 lata
  • Postów:29
0

Chyba nie do końca rozumiem co masz na myśli.

bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
1

Nie analizowałem zapytania, bo wygląda przerażająco. Ale niezależnie od długości zapytania możesz to zrobić tak:

Kopiuj
String query = //Twoje zapytanie
st.executeUpdate(query);

st jest typu Statement.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
edytowany 3x, ostatnio: madmike
PO
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 2 lata
  • Postów:29
0
bogdans napisał(a):

Nie analizowałem zapytania, bo wygląda przerażająco. (..).

Chyba najpierw spróbuję to zapytanie poprawić. Sądzę, że da się to zrobić inaczej.

bogdans napisał(a):
Kopiuj
Strong query = //Twoje zapytanie
st.executeUpdate(quiery);

Czy nie powinno być String zamiast Strong??

madmike
Poprawiłem @bogdans'owi, toż to tylko literówki ;)
I1
  • Rejestracja:ponad 12 lat
  • Ostatnio:prawie 10 lat
  • Postów:50
1

String ;) Poza tym używaj PreparedStatement, bo jak Ci ktoś w polu formularza wpisze coś typu "DROP ALL TABLES" to sie mocno zdziwisz ;)

edytowany 1x, ostatnio: Ilidan18
PO
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 2 lata
  • Postów:29
0

Jakoś pokonałem javę ale mam błąd sql;

Kopiuj
org.postgresql.util.PSQLException: ERROR : syntax error at or near "(" Pozycja: 212

Jak mam czytać to :"Pozycja 212" ???

bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
0

212 znak w Stringu tworzącym zapytanie.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.