SQL查询从另一个表中选择1个表和1列(与表1中的名称相同)中的所有内容

时间:2018-06-29 21:18:48

标签: c# sql ms-access

我有3张桌子。 表1:

Products:
ProductId Category Model Price Quantity

表2:

OrderLines:
OrderId ProductId Quantity

table3:

Orders:
OrderId CustomerId

(还有一个客户表,但这没关系)

现在,我想从OrderLines表中具有ProductId = ProductId的Products表中选择所有产品数据,但要从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“哇”“高清” 30 5
4“ yay”“ sd” 50 60
5“哇”“ ss” 12 5

预期输出: 产品系列: 每个对象都是Product类型,在表中具有相同的字段。 (已经定义为类)。 数组中的第一个对象是:
productId = 3,类别=“哇”,型号=“ hd”,价格= 30,数量=  1(** 1!不是5)
第二个对象:
productId = 4,Category =“ yay”,Model =“ sd”,price = 50,Quantity = 5

我在Visual Studio Winforms中使用c#。 数据库是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 :(得分:1)

根据连接,这将为您提供来自产品的四列和来自订单行的一列。

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

小写样式说明-请勿在表名中使用复数形式。例如使用   产品不是产品,订单不是订单。没有很好的理由,除了那是每个人的做法。

答案 1 :(得分:0)

有效的实际查询是:

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让我朝正确的方向开始。

由于提到了卢卡斯(lucas),因此进行了编辑,删除了WHERE IN SELECT ......

答案 2 :(得分:-1)

select p.ProductId,sum(ol.Quantity)
from Products p
inner join orderlines ol on p.ProductID=ol.ProductID
group by p.ProductId

答案 3 :(得分:-1)

SELECT p.*, ol.Quantity as OrderLineQuantity from
    Products as p
    inner join
    OrderLines as ol
    on p.Id = ol.ProductId