C# SQL查询,从一个表和另一个表中的一列(与表1中的名称相同)中选择所有内容
我有三张桌子。 表1: 表2: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]
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