SQL INSERT na podstawie numeru pesel

0

Witam. Posiadam tabele, które prezentują sie w ten sposób

Order
Id  |  Order_Name   |   Order_Price
1   |   Deski                    10,20
2   |   Farba                    23,95
3   |   Pedzel                    7,50

Customer
Id  |  Customer_Name |  Customer_PESEL
1          Cust1                 90093000839
2          Cust2                 60042100321
3          Cust3                 40010500532


OrderCustomerRel
Id  |  Order_ID  |   Customer_ID

Potrzebuje wykonać INSERTA do tabeli OrderCustomerRel na podstawię numer pesel klienta. Nie bardzo rozumiem jak składać mocniejsze zapytania w SQL dlatego proszę o pomoc w nakierowaniu. Probówałem to zrobić w ten sposób, po samej nazwie klienta

INSERT INTO 
OrderCustomerRel
(
	Order_ID, Customer_ID
)
SELECT Id FROM Customer WHERE Customer_Name = 'Cust1'

Natomiast tutaj w select powinienem wstawić Order_ID i Customer_ID, customer_ID pobiorę w sposób przedstawiony ale doczepić jeszcze jednego sql, który mi zwróci ID Deski to się trochę gubię, już nie mówiąc o tym żeby jeszcze sprawdzić pesel i w zależności co wyjdzie puścić odpowiedni INSERT.

Prosiłbym o małą pomoc w nakierowaniu lub wytłumaczeniu jak składać większe zapytania (select w selectcie, select w insertcie itd.), które są wymagane w tym przypadku. Z góry bardzo dziękuje i pozdrawiam.

0

najpierw napisz sobie SQLa, który zwróci Ci wszystkie Order.Id i Customer.Id jakie chcesz mieć w tej tabeli. Możesz to zrobić mniej więcej tak

select 
  o.id,
  c.id
from
  order o,
  customer c
where
  o.Order_Name  = 'cos'
  AND c.Customer_Name = 'Cust1'

Jak już powyższe zapytanie zwróci to co byś chciał to robisz tak

insert into OrderCustomerRel (Order_ID, Customer_ID) i_tu_cale_powyzsze_zapytanie
0

Niedawno wykradli numery PESEL na ogromną skalę a teraz Ty chcesz robić zamówienia bazowane na PESEL... przypadek? ;)

0

Wielkie dzięki, działa. Dowiedziałem się, że można robić selecta od razu na dwie tabelę, udało mi się zrobić resztę poleceń. Chciałbym jeszcze wykonać zapytanie, które zwróci mi Customer_Name, Order_Name, Customer_PESEL

Coś takiego mi wyszło, co prawda zwraca dobrze ale może da się to zrobić inaczej, prościej i ładniej. Z góry wielkie dzięki

SELECT 
	c.Customer_Name, 
	o.Order_Name, 
	c.Customer_PESEL 
FROM 
	Order o, 
	Customer c, 
	OrderCustomerRel r 
WHERE 
	r.Customer_ID = c.Id 
	AND o.Id = r.Order_ID 
	AND o.Name = 'Deski' 
GROUP BY 
	c.Customer_Name, 
	o.Order_Name, 
	c.Customer_PESEL
0

w poprzednim wypadku potrzebowałeś iloczyn kartezjański obu tabel, czyli połączyć każdy z każdym. Jest to rzadko stosowane zapytanie ponieważ przy teoretycznie małej ilości danych potrafi zarżnąć bazę. Na ogół do łączenia tabel używa się joinów. Tutaj http://www.sqlpedia.pl/laczenie-tabel-sql/ jest dość fajnie opisane razem z przykładami i obrazkami :).

To drugie zapytanie powinno wyglądać tak

SELECT 
    c.Customer_Name, 
    o.Order_Name, 
    c.Customer_PESEL 
FROM 
    OrderCustomerRel r 
JOIN order o ON o.Id = r.Order_ID 
JOIN customer c ON c.Id = r.Customer_ID 
WHERE 
  o.Name = 'Deski'

albo tak

SELECT 
    c.Customer_Name, 
    o.Order_Name, 
    c.Customer_PESEL 
FROM 
    OrderCustomerRel r 
JOIN order o ON o.Id = r.Order_ID AND o.Name = 'Deski'
JOIN customer c ON c.Id = r.Customer_ID 

z drugiej strony jako tabelę "główną" w tym wypadku możesz wybrać dowolną, np.

SELECT 
    c.Customer_Name, 
    o.Order_Name, 
    c.Customer_PESEL 
FROM 
    order o
JOIN OrderCustomerRel r ON r.Order_ID = o.Id
JOIN customer c ON c.Id = r.Customer_ID 
WHERE 
  o.Name = 'Deski'

PS. GROUP BY w tym wypadku nie jest potrzebne

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