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

C# SQL查询,从一个表和另一个表中的一列(与表1中的名称相同)中选择所有内容,c#,sql,ms-access,C#,Sql,Ms Access,我有三张桌子。 表1: 表2: OrderLines: OrderId ProductId Quantity 表3: Orders: OrderId CustomerId 还有一张客户表,但这并不重要 现在,我想从products表中选择OrderLines表中ProductId=ProductId的所有产品数据,但从OrderLines表中获取这些相同产品的数量数据 尝试了各种查询,但找不到有效的查询 这是我最后尝试的一件事: SELECT tb1.* ,tb2.[Quantity]

我有三张桌子。 表1:

表2:

OrderLines:
OrderId ProductId Quantity
表3:

Orders:
OrderId CustomerId
还有一张客户表,但这并不重要

现在,我想从products表中选择OrderLines表中ProductId=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";
没用

有什么建议吗

非常感谢

样本数据: 订单: 订单ID客户ID 1 2

订单行: 订单ID产品ID数量 1 3 1 1 4 5

产品: ProductId类别模型价格数量 3 wow hd 30 5 4 yay sd 50 60 5哇ss 12 5

预期产出: 产品系列: 每个对象都是Product类型,在中具有与表中相同的字段。已经定义了它的类。 数组中的第一个对象是: productId=3,类别=wow,型号=hd,价格=30,数量= 1 **1! 不是5 第二个目标: productId=4,类别=yay,型号=sd,价格=50,数量=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));
        }

抱歉,我希望现在更清楚。

这将根据联接从产品中获取四列,从订单行中获取一列

select p.ProductId,sum(ol.Quantity)
from Products p
inner join orderlines ol on p.ProductID=ol.ProductID
group by p.ProductId
SELECT p.productId, p.category, p.model, p.price, o.quantity
from products p
join orderlines o on p.productid = o.productid
小字体注释-表格名称不要使用复数形式。例如使用 产品不是产品,订单行不是订单行。没有什么好的理由,除了每个人都是这样做的


实际有效的查询是:

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…

1样本数据和所需结果将非常有用。2 MySQL不使用方括号。您确定已正确标记问题吗?样本数据和预期输出数据plz?正确标记!!!标记MYSQL,但代码看起来像SQL Server。这是哪一个???所以在你的问题中添加Access标记,这样不知道Access的人就不会浪费时间阅读这个问题。@Eric done.done。请添加一个解释,而不仅仅是原始代码转储。请添加一个解释,而不仅仅是原始代码转储。@mason这是一个非常基本和简单的连接,真的不需要在那里解释太多。若你们看这个问题,他已经使用了一个内部连接,所以我假设他知道它是什么。如果其他人遇到这个问题,无法理解内部连接,那么最好让他们自己理解基本SQL,而不是试着握住他们的手说1+1=2。对不起,梅森,你正在测试一个请添加解释,而不仅仅是原始代码转储。斯帕姆博特,他回答了吗?你认为4行是转储吗?你有没有考虑过问题的简单性足以让你投反对票?Lucas说得很好。如果你在ProductId上做一个内部连接,下面是ProductId在SELECT中的位置。。。是完全冗余的。@Lucas,但我必须有某种方法来选择作为Orders表一部分的ProductID,以及该OrderId。没有一个解决方案使用@orderId这样的参数,这是必需的。@Piepypye-欢迎使用堆栈溢出。虽然我知道许多来自其他网站的人只希望进行一次对话,但实际上这并不是一种使堆栈溢出有效的方法。这是很重要的投票答案是正确的和帮助,而不仅仅是张贴自己的答案。这鼓励人们帮助你,比为霍根说声谢谢要好得多。向上投票是对stackoverflow表示感谢的方式。@dbmitch-谢谢!我得说那是个打字错误,不是拼写错误,而是个好眼力。
SELECT p.productId, p.category, p.model, p.price, o.quantity
from products p
join orderlines o on p.productid = o.productid
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