Łączenie tabel z warunkiem

0

Witam,
Jak możliwie najprościej połączyć coś takiego: ?

W jednej tabeli są pracownicy wraz kolumnami mówiącymi o czasie rozpoczęcia i końcu pracy.

Druga tabela to produktu, godzina wytworzenia oraz pracownik

Chce uzyskać następujący efekt:

Utworzyć nową tabelę, gdzie będą produkty z drugiej ograniczone tym, że godzina wytworzenia jest w granicach czasu pracy pracownika.

Występuje wielu pracowników i wiele produktów.

0

A zwykłe WHERE ... BETWEEN tu nie zadziała?

0

Z pewnością zadziała, ale niestety dopiero zaczynam z SQL.

Problemem jest dla mnie, że wartości dla BETWEEN muszę pobrać z kilku wierszy innej tabeli

1

Po kolei:

W jednej tabeli są pracownicy wraz kolumnami mówiącymi o czasie rozpoczęcia i końcu pracy.

Druga tabela to produktu, godzina wytworzenia oraz pracownik

Upraszczając - tabela 1: pracownik (id_pracownika (lub coś innego pozwalające na identyfikację), jakieś_dane_pracownika, początek, koniec), tabela 2: produkt (nazwa, czas_wytworzenia, id_pracownika)

Utworzyć nową tabelę, gdzie będą produkty z drugiej ograniczone tym, że godzina wytworzenia jest w granicach czasu pracy pracownika.

SELECT jakieś_dane_pracownika, produkt, co_jeszcze_potrzebne 
FROM produkt  
odpowiedni JOIN  pracownik ON
warunek joina 
WHERE produkt.czas_wytworzenia BETWEEN pracownik.początek AND pracownik.koniec(*)

(*) - jak każde wyrażenie logiczne te również może mieć kilka "składników" - (warunek 1 AND/OR warunek 2) AND (warunek 3 AND/OR warunek 4) itp.

Problemem jest dla mnie, że wartości dla BETWEEN muszę pobrać z kilku wierszy innej tabeli

Czyli jak? Masz np w tabeli 2 takie coś:
produkt 1, 12.00, pracownik 1
produkt 1, 12.00, pracownik 2
produkt 1, 12.00, pracownik 3
produkt 2, 10.00, pracownik 1
produkt 2, 10.00, pracownik 4
produkt 2, 10.00, pracownik 5

jeden produkt - wielu pracowników, jeden pracownik - wiele produktów? Chcesz uniknąć sytuacji w której w tabeli wynikowej dostajesz kilka wierszy tego samego produktu? Czy np. jest produkt, ale jeden z pracowników przy nim pracujących kończy przed wytworzeniem i nie chcesz tego produktu uwzględniać?

Inna sprawa, że mnie się zawsze ważniejsze wydawały kolumny.

dopiero zaczynam z SQL

Jeśli jeszcze nie znasz, to łap http://sqlfiddle.com/, możesz tam ćwiczyć do woli.

0

Dokładnie chodzi o to, że w pierwszej tabeli pracownik są wiersze z czasami, w których pracownik powinien pracować (początek, koniec), a w drugiej wytworzone produkty wraz z godziną i pracownikiem.
Chcę wyeliminować te, które zostały wykonane poza zadanym czasem pracy.
Jeden pracownik wiele produktów, w tabeli wynikowej może (nawet musi) być kilka wierszy tego samego produktu.

1

Dodalabym w takim razie select kolumny* from tab1 join tab2 where produkt_czas_wytworzenia not in (tutaj select z kolumnami i between.) Coś w ten deseń bym pokombinowala. Ps not in jesli chcesz wyświetlić produkty spoza czasu pracy a in jesli chcesz wyświetlić produkty wytworzone w czasie pracy :)

0
Serechiel napisał(a):

Po kolei:

W jednej tabeli są pracownicy wraz kolumnami mówiącymi o czasie rozpoczęcia i końcu pracy.

Druga tabela to produktu, godzina wytworzenia oraz pracownik

Upraszczając - tabela 1: pracownik (id_pracownika (lub coś innego pozwalające na identyfikację), jakieś_dane_pracownika, początek, koniec), tabela 2: produkt (nazwa, czas_wytworzenia, id_pracownika)

Utworzyć nową tabelę, gdzie będą produkty z drugiej ograniczone tym, że godzina wytworzenia jest w granicach czasu pracy pracownika.

SELECT jakieś_dane_pracownika, produkt, co_jeszcze_potrzebne 
FROM produkt  
odpowiedni JOIN  pracownik ON
warunek joina 
WHERE produkt.czas_wytworzenia BETWEEN pracownik.początek AND pracownik.koniec(*)

(*) - jak każde wyrażenie logiczne te również może mieć kilka "składników" - (warunek 1 AND/OR warunek 2) AND (warunek 3 AND/OR warunek 4) itp.

Problemem jest dla mnie, że wartości dla BETWEEN muszę pobrać z kilku wierszy innej tabeli

Czyli jak? Masz np w tabeli 2 takie coś:
produkt 1, 12.00, pracownik 1
produkt 1, 12.00, pracownik 2
produkt 1, 12.00, pracownik 3
produkt 2, 10.00, pracownik 1
produkt 2, 10.00, pracownik 4
produkt 2, 10.00, pracownik 5

jeden produkt - wielu pracowników, jeden pracownik - wiele produktów? Chcesz uniknąć sytuacji w której w tabeli wynikowej dostajesz kilka wierszy tego samego produktu? Czy np. jest produkt, ale jeden z pracowników przy nim pracujących kończy przed wytworzeniem i nie chcesz tego produktu uwzględniać?

Inna sprawa, że mnie się zawsze ważniejsze wydawały kolumny.

dopiero zaczynam z SQL

Jeśli jeszcze nie znasz, to łap http://sqlfiddle.com/, możesz tam ćwiczyć do woli.

Dzięki wielkie, to działa jak powinno.
Czy jest jeszcze możliwość zliczenia dla każdej operacji pracownika ile tych produktów było dołączonych przez joina?

1

Czy jest jeszcze możliwość zliczenia dla każdej operacji pracownika ile tych produktów było dołączonych przez joina?

Bodajże COUNT() odpowiednio użyte dało by radę. Ale ręki nie dałbym sobie uciąć.

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