Для сведения данных из разных таблиц мы можем использовать стандартную команду SELECT. Допустим, у нас есть следующие таблицы, которые связаны между собой связями:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| USE productsdb; CREATE TABLE Products ( Id INT IDENTITY PRIMARY KEY , ProductName NVARCHAR(30) NOT NULL , Manufacturer NVARCHAR(20) NOT NULL , ProductCount INT DEFAULT 0, Price MONEY NOT NULL ); CREATE TABLE Customers ( Id INT IDENTITY PRIMARY KEY , FirstName NVARCHAR(30) NOT NULL ); CREATE TABLE Orders ( Id INT IDENTITY PRIMARY KEY , ProductId INT NOT NULL REFERENCES Products(Id) ON DELETE CASCADE , CustomerId INT NOT NULL REFERENCES Customers(Id) ON DELETE CASCADE , CreatedAt DATE NOT NULL , ProductCount INT DEFAULT 1, Price MONEY NOT NULL ); |
Здесь таблицы Products и Customers связаны с таблицей Orders связью один ко многим. Таблица Orders в виде внешних ключей ProductId и CustomerId содержит ссылки на столбцы Id из соответственно таблиц Products и Customers. Также она хранит количество купленного товара (ProductCount) и и по какой цене он был куплен (Price). И кроме того, таблицы также хранит в виде столбца CreatedAt дату покупки.
Пусть эти таблицы будут содержать следующие данные:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
| INSERT INTO Products VALUES ( 'iPhone 6' , 'Apple' , 2, 36000), ( 'iPhone 6S' , 'Apple' , 2, 41000), ( 'iPhone 7' , 'Apple' , 5, 52000), ( 'Galaxy S8' , 'Samsung' , 2, 46000), ( 'Galaxy S8 Plus' , 'Samsung' , 1, 56000), ( 'Mi 5X' , 'Xiaomi' , 2, 26000), ( 'OnePlus 5' , 'OnePlus' , 6, 38000) INSERT INTO Customers VALUES ( 'Tom' ), ( 'Bob' ),( 'Sam' ) INSERT INTO Orders VALUES ( ( SELECT Id FROM Products WHERE ProductName= 'Galaxy S8' ), ( SELECT Id FROM Customers WHERE FirstName= 'Tom' ), '2017-07-11' , 2, ( SELECT Price FROM Products WHERE ProductName= 'Galaxy S8' ) ), ( ( SELECT Id FROM Products WHERE ProductName= 'iPhone 6S' ), ( SELECT Id FROM Customers WHERE FirstName= 'Tom' ), '2017-07-13' , 1, ( SELECT Price FROM Products WHERE ProductName= 'iPhone 6S' ) ), ( ( SELECT Id FROM Products WHERE ProductName= 'iPhone 6S' ), ( SELECT Id FROM Customers WHERE FirstName= 'Bob' ), '2017-07-11' , 1, ( SELECT Price FROM Products WHERE ProductName= 'iPhone 6S' ) ) |
Теперь соединим две таблицы Orders и Customers:
1
| SELECT * FROM Orders, Customers |
При такой выборке для каждая строка из таблицы Orders будет совмещаться с каждой строкой из таблицы Customers. То есть, получится перекрестное соединение. Например, в Orders три строки, а в Customers то же три строки, значит мы получим 3 * 3 = 9 строк:
То есть в данном случае мы получаем прямое (декартово) произведение двух групп. Но вряд ли это тот результат, который хотелось бы видеть. Тем более каждый заказ из Orders связан с конкретным покупателем из Customers, а не со всеми возможными покупателями.
Чтобы решить задачу, необходимо использовать выражение WHERE и фильтровать строки при условии, что поле CustomerId из Orders соответствует полю Id из Customers:
1
2
| SELECT * FROM Orders, Customers WHERE Orders.CustomerId = Customers.Id |
Теперь объединим данные по трем таблицам Orders, Customers и Proucts. То есть получим все заказы и добавим информацию по клиенту и связанному товару:
1
2
3
| SELECT Customers.FirstName, Products.ProductName, Orders.CreatedAt FROM Orders, Customers, Products WHERE Orders.CustomerId = Customers.Id AND Orders.ProductId=Products.Id |
Поскольку надо соединить три таблицы, то применяются как минимум два условия. Ключевой таблицей остается Orders, из которой извлекаются все заказы, а затем к ней подсоединяется данные по клиенту по условию
Orders.CustomerId = Customers.Id
и данные по товару по условию Orders.ProductId=Products.Id
Поскольку в данном случае названия таблиц сильно увеличивают код, то мы его можем сократить за счет использования псевдонимов таблиц:
1
2
3
| SELECT C.FirstName, P.ProductName, O.CreatedAt FROM Orders AS O, Customers AS C, Products AS P WHERE O.CustomerId = C.Id AND O.ProductId=P.Id |
Если необходимо при использовании псевдонима выбрать все столбцы из определенной таблицы, то можно использовать звездочку:
1
2
3
| SELECT C.FirstName, P.ProductName, O.* FROM Orders AS O, Customers AS C, Products AS P WHERE O.CustomerId = C.Id AND O.ProductId=P.Id |
Комментариев нет:
Отправить комментарий