Как ОБЪЕДИНИТЬ несколько таблиц в базе данных SQL, чтобы получить идентификаторы продуктов, идентификаторы заказов и информацию о клиентах в одной таблице?

#sql #database #left-join #inner-join

#sql #База данных #левое соединение #inner-join

Вопрос:

Я не новичок в SQL-кодировании, я просто обычно привык выполнять небольшие запросы данных в PHP из базы данных, но время от времени сталкиваюсь с проблемой, когда мне нужно объединять таблицы, и это просто над моей головой. Я решил, что начну расширять свои знания в этой области, пытаясь выполнить одну единственную задачу, но я совершенно в тупике.

Я изучаю это с веб-сайта W3Schools, поэтому все мои ссылки взяты из БАЗЫ данных в их TryItEditor, расположенном здесь:

https://www.w3schools.com/sql/trysql.asp?filename=trysql_select_all

Я пытаюсь использовать SQL для отображения CustomerName с размещенным им идентификатором заказа, а также ProductName и ProductID.

Способ, которым я пытался это сделать — я знаю, что это, вероятно, неправильно, но я новичок в этом — использовать ЛЕВОЕ СОЕДИНЕНИЕ или ВНУТРЕННЕЕ СОЕДИНЕНИЕ для первого СОЕДИНЕНИЯ двух столбцов Products .ProductID и OrderDetails.ProductID. Затем я пытался ОБЪЕДИНИТЬ OrderDetails.ProductID также. Затем, наконец, пытаюсь ПРИСОЕДИНИТЬСЯ к клиентам.CustomerID в Orders.CustomerID.

Вот мой код:

SELECT Products.ProductID, OrderDetails.ProductID, Products.ProductName, Customers.CustomerName, Products.ProductName, Orders.OrderID FROM OrderDetails LEFT JOIN Products ON OrderDetails.ProductID = Products.ProductID LEFT JOIN Orders ON OrderDetails.ProductID = Products.ProductID LEFT JOIN Customers ON Customers.CustomerID = Orders.CustomerID;

Однако, когда я запускал этот код, он отображал 101528 строки, хотя я четко знаю по таблице заказов, что всего было всего 196 заказов.

Я пытался просмотреть различные учебные пособия, которые я нашел в Интернете, чтобы понять, как это сделать, но я не получаю желаемого результата. Если бы кто-нибудь мог указать мне правильное направление того, что я пытаюсь сделать, я был бы очень признателен! Спасибо!

ОБНОВЛЕНИЕ: мой желаемый результат — увидеть 196 строк (количество заказов) со следующими столбцами:

Идентификатор продукта — ProductName — CustomerName — OrderID —

ОБНОВЛЕНИЕ до ответа Натана:

SELECT Customers.CustomerID, Orders.OrderID, Products.ProductID, Products.ProductName, Customers.CustomerName FROM Orders INNER JOIN OrderDetails ON OrderDetails.OrderID = Orders.OrderID INNER JOIN Products ON OrderDetails.ProductID = Products.ProductID INNER JOIN Customers ON Customers.CustomerID = Orders.CustomerID

Я смог получить желаемое представление, но все равно слишком много строк.

Комментарии:

1. Ваш результирующий набор будет иметь то же количество строк, что и таблица OrderDetails, что, я полагаю, будет намного больше, чем количество заказов, поскольку каждый заказ будет иметь много соответствующих записей OrderDetail

Ответ №1:

Начните с внутренних объединений. Левое соединение означает, что вы показываете строку слева, даже если строки справа там нет. Время для левых соединений после того, как вы сможете выполнять внутренние соединения.

Это помогает иметь ERD. Если у вас ее еще нет, нарисуйте ее. Выберите стартовую таблицу, которая выглядит как подходящее место для получения всей необходимой информации. Соединения соответствуют связям на диаграмме.

Сначала я бы присоединился к order to order detail, используя идентификатор заказа. Затем присоедините детали заказа к продукту, используя идентификатор продукта. Затем присоедините заказ к клиенту по идентификатору клиента.

Добавляйте объединения по одному и убедитесь, что результаты имеют смысл. Обратите внимание, что если вы объединяете заказы с деталями заказа по идентификатору заказа, вы получите обратно количество строк, равное количеству деталей, а не количеству заказов.

Комментарии:

1. @JCBiggar: вы соединили детали заказа с продуктом, а затем с продуктом на заказ.

2. Итак, я обновил свой вопрос, чтобы опубликовать код, который я пробовал… Это сработало для отображения моего желаемого представления, но строк все еще слишком много. Всего должно быть всего 196 заказов. Пожалуйста, поправьте меня, где я ошибся. Спасибо!

3. @JCBiggar: вы видели, где NickW и я оба указали, что запрос должен возвращать количество строк, равное деталям, а не количеству заказов?

4. Да! и это только сейчас поражает меня. Теперь немного больше смысла. Как бы я мог получить только количество строк из заказов? Возможно ли это вообще?

5. @JCBiggar: вы можете не указывать таблицу сведений, но вы потеряете продукты. Возможно, вы захотите нарисовать ERD, чтобы помочь представить это.