Запрос SQL для выбора всего из 1 таблицы и 1 столбца (то же имя, что и в таблице 1) из другой таблицы - PullRequest
0 голосов
/ 30 июня 2018

у меня 3 таблицы. таблица1:

Products:
ProductId Category Model Price Quantity

table2:

OrderLines:
OrderId ProductId Quantity

Таблица3:

Orders:
OrderId CustomerId

(есть также таблица клиентов, но это не имеет значения)

Теперь я хочу выбрать все данные о товарах из таблицы Products, для которых ProductId = ProductId в таблице OrderLines имеет ProductId =, но получить данные о количестве (тех же товаров) из таблицы OrderLines.

Перепробовал все виды запросов, не смог найти тот, который работает.

Вот последнее, что я вроде попробовал:

 SELECT tb1.* ,tb2.[Quantity] 
 FROM [Products] tb1, [OrderLines] tb2 
 WHERE tb1.[ProductId] IN (
    SELECT [ProductId] FROM [OrderLines] WHERE OrderId = @orderId)    
 INNER JOIN [OrderLines] tb2 ON[Products].Quantity = [OrderLines].Quantity";

не сработало.

есть предложения?

Большое спасибо.

пример данных: Заказы: OrderId CustomerId
1 2

OrderLines:
OrderId ProductId Количество
1 3 1
1 4 5

Продукты:
ProductId Категория Модель Цена Количество
3 "вау" "hd" 30 5
4 "yay" "sd" 50 60
5 "вау" "сс" 12 5

ожидаемый результат: массив продуктов: каждый объект имеет тип Product, имеющий те же поля, что и в таблице. (уже определено, это класс). Первый объект в массиве:
productId = 3, категория = "вау", модель = "hd", цена = 30, количество = 1 (** 1! Не 5)
2-й объект:
productId = 4, категория = "yay", модель = "sd", цена = 50, количество = 5

Я использую c # в visual studio, Winforms. база данных Access. это функция:

public Product[] GetProductsByOrderId(int orderId)
        {
            DataSet ds = new DataSet();
            ArrayList arrProducts = new ArrayList();

            //"SELECT tb1.* ,tb2.[Quantity] FROM [Products] tb1, [OrderLines] tb2 WHERE tb1.[ProductId] IN (SELECT [ProductId] FROM [OrderLines] WHERE OrderId = @orderId) INNER JOIN [OrderLines] tb2 ON[Products].Quantity = [OrderLines].Quantity"
            string cmdStr = "SELECT p.*, ol.Quantity as OrderLineQuantity from Products as p    inner join    OrderLines as ol    on p.Id = ol.ProductId";

            using (OleDbCommand command = new OleDbCommand(cmdStr))
            { 
                command.Parameters.AddWithValue("@orderId", orderId);
                ds = GetMultipleQuery(command);
            }

            DataTable dt = new DataTable();
            try
            {
                dt = ds.Tables[0];
            }
            catch { }
            foreach (DataRow tType in dt.Rows)
            {
                Product productData = new Product();

                productData.ProductId = int.Parse(tType[0].ToString());
                productData.Category = tType[1].ToString();
                productData.Model = tType[2].ToString();
                productData.Price = double.Parse(tType[3].ToString());
                productData.Quantity = int.Parse(tType[4].ToString());
                arrProducts.Add(productData);
            }
            return (Product[])arrProducts.ToArray(typeof(Product));
        }

Извините, и я надеюсь, теперь стало понятнее.

Ответы [ 4 ]

0 голосов
/ 30 июня 2018

Фактический запрос, который работает:

SELECT p.ProductId, p.Category, p.Model, p.Price, o.Quantity 
FROM [Products] p 
INNER JOIN [OrderLines] o ON p.ProductId = o.ProductId 
WHERE o.OrderId = @orderId 
ORDER BY p.ProductId

Спасибо за @Hogan за то, что я начал в правильном направлении.

отредактировано благодаря упоминанию Лукаса, удалено ГДЕ В ВЫБОРЕ ...

0 голосов
/ 30 июня 2018
SELECT p.*, ol.Quantity as OrderLineQuantity from
    Products as p
    inner join
    OrderLines as ol
    on p.Id = ol.ProductId
0 голосов
/ 30 июня 2018

Это даст вам четыре столбца из продукта и 1 из строк заказа на основе объединения.

SELECT p.productId, p.category, p.model, p.price, o.quantity
from products p
join orderlines o on p.productid = o.productid

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

0 голосов
/ 30 июня 2018
select p.ProductId,sum(ol.Quantity)
from Products p
inner join orderlines ol on p.ProductID=ol.ProductID
group by p.ProductId
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...