[Firebird SQL] Warunkowy insert rekordu

0

Cześć.
Robię sobie insert z selecta do pewnej tabeli.
Jej struktura jest taka:

ID, ID_TOW, DATA_R, DATA_W, ILOSC

I teraz kwestia jest taka.
Chcę zrobić insert wtedy i tylko wtedy, jeśli w tabeli nie ma rekordu takiego, że:
ID_TOW = ID towaru, który insertuję, data_r = null i data_w = null

Jeśli taki rekord jest, do insertu ma nie dojść.

Moje zapytanie jest takie:

insert into zamowienia(ID_TOW, ILOSC)
       select tt.id, (select dost_ilosc from towary where id=tt.id)
       from temptrans tt
       join towary t on tt.id = t.id
       where t.stan_mag<10

tt.id to jest właśnie to ID_TOW.
Jak to przerobić?

0

może podaj dokładniej strukturę tabeli do której robisz inserta i tej z której chcesz tego inserta zrobnić i powiązania między nimi

0
Misiekd napisał(a)

może podaj dokładniej strukturę tabeli do której robisz inserta i tej z której chcesz tego inserta zrobnić i powiązania między nimi

więc tak.
Tabela zamowienia
ID
ID_TOW(id z tabeli TOWARY)
DATA_R
DATA_W (pewne daty)
ILOSC - ilość danego towaru do zamówienia(musi być tu, bo musi być możliwość zmiany na poziomie zamówień)

Tabela TEMPTRANS
Przechowuje towary, które zostały dodane do transakcji(mają być sprzedane klientowi)
ID - id z tabeli TOWARY
towar - mówi, czy to jest towar(1), czy usługa(0) (w sumie też muszę dodać to do zapytania)

Jest jeszcze kilka pól, ale zupełnie nie związanych z tym tematem

tabela TOWARY:
ID
Nazwa
STAN_MAG - stan magazynowy towaru(odejmowany po dodaniu go do temptrans, jeśli trasnakcja nie została zatwierdzona, to stan magazynowy jest przywracany)
DOST_ILOSC - domyślna ilosc towaru do zamowienia(można zmienić na poziomie zamówień)

Kwestia jest taka, że chcę to zrobić jak najbardziej optymalnie, a więc:
w momencie, gdy przeprowadzana transakcja zostaje zatwierdzona, wtedy należy do tabeli zamowienia dodać te towary, które zostały sprzedane i ich stan magazynowy jest mniejszy od 10.

Lecz najpierw trzeba sprawdzić, czy w tabeli zamowienia jest już dany towar z pustymi datami, ponieważ kilka transakcji może być wykonywanych jednocześnie. I bez tego sprawdzenia dojdzie do sytuacji, kiedy w tabeli zamowienia jest kilka zamówień tego samego towaru.

0

ZAMOWIENIA

*ID_ZAMOWIENIE
#ID_TOWAR
DATA_R
DATA_W
ILOSC

TEMPTRANS

#ID_TOWAR
TOW_TYP

TOWARY

*ID_TOWAR
NAZWA
STAN_MAG
DOST_ILOSC

INSERT INTO zamowienia(id_towar, ilosc)
(SELECT t.id_towar, t.dost_ilosc) FROM towary t, temptrans tt, WHERE t.dost_ilosc < 10 AND tt.id_towar = t.id_towar AND t.id_towar NOT IN (SELECT id_towar FROM zamowienia))

coś na ten kształt powinno działać

i na koniec taka mała uwaga - nie nazywaj pól ID bo potem nie wiadomo co to za pole

0

Misiekd: Przecież w zapytaniach, w których jest wiecej niż jedna tabela i tak wykorzystuje się nazwatabeli.nazwapola. Więc co za problem nazywać pola ID? Jeśli się w wynikach pokrywają, to też nie jest problem, by rzutować inną nazwę w zapytaniu (AS). A zapytania dużo krótsze wychodzą :).

0

no niby masz Adam rację ale z doświadczenia wiem, że jak napiszesz te 3-4 znaki więcej w nazwie pola to potem będziesz miał tylko kożyści. Przy 2 -3 tabelach to może nie jest tak widoczne ale jak masz tabel 20 - 30 to już zaczyna się człowiek gubić. Poza ty jak klucz główny tabeli pola nazwiesz pola_id (id_pola lub podobnie) to jak w tabeli obiekt dasz pole (klucz obcy) pola_id to od razu wiadomo do jakiej tabeli się odnosi i jak są one między sobą połączone

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