【问题标题】:Retrieve data from different tables从不同的表中检索数据
【发布时间】:2018-07-04 11:20:53
【问题描述】:

我想从如下两个表中检索数据。我有一个Products 表,其中有P_idP_name 列和一个BATCH 表,其中p_id_fk 作为Products 表的外键。

这是我的查询;我想从Product 表中检索产品名称,因为我已将Products 表主键作为外来存储在Batch 表中。

SqlDataAdapter sda = new SqlDataAdapter("Select batch_id, quantity, left_qty, purchaseDate, manufacturing_date, expiryDate from batch where Convert(DATE, expiryDate, 103) BETWEEN @from AND @to", con);

sda.SelectCommand.Parameters.AddWithValue("@from", Convert.ToDateTime(datePicker1.SelectedDate.Value).ToString("yyyyMMdd"));
sda.SelectCommand.Parameters.AddWithValue("@to", Convert.ToDateTime(datePicker2.SelectedDate.Value).ToString("yyyyMMdd"));

【问题讨论】:

  • 出现错误/异常会得到什么?你提到查询两张表,但我只看到一张。
  • 那么,您是在问如何处理JOINJOIN 是 SQL 的基础之一,您可以在文档中阅读它们:Joins (SQL Server)。我建议阅读一下,因为如果你想编写任何类型的 SQL,包括 T-SQL,这是一个核心要求。

标签: c# sql .net sql-server


【解决方案1】:

如果要从两个表中检索数据,则需要使用 SQL JOIN

我不确定您的表格的确切组成,但如下所示

Select batch_id,
product_name,
quantity,
left_qty,
purchaseDate,
manufacturing_date,
expiryDate
from batch B
INNER JOIN Products P
ON P.P_id = B.P_id
where Convert(DATE,expiryDate,103) BETWEEN @from AND @to

【讨论】:

  • 这不是我想要的,我想从 Products 表中获取 Product_name,
【解决方案2】:

您需要在这里加入或交叉申请。

选项 1 - 内连接:

    Select         
    b.batch_id,pd.product_name,quantity,left_qty,
    purchaseDate,manufacturing_date,expiryDate from batch b 
    inner join product pd on pd.p_id = b.p_id  where Convert(DATE,expiryDate,103) 
    BETWEEN @from AND @to

选项 2 交叉应用:

    Select         
    b.batch_id,pd.product_name,quantity,left_qty,
    purchaseDate,manufacturing_date,expiryDate from batch b 
    cross apply
    (
     select product_name from product p
     where p.p_id = b.p_id
    ) pd
    where Convert(DATE,expiryDate,103) 
    BETWEEN @from AND @to

有关交叉应用的更多信息,请查看here

【讨论】:

  • 这不是我想要的,我希望从 Products 表中检索 Product_name。批处理表有名为 p_id_fk 的列,它是外键列,包含 Products 的值。
  • 这正是您需要做的,在表之间连接,然后您从产品表中获取 product_name。
  • 我已经尝试过了,但它在“pd.product_name”上给出错误,它是一个无效的对象
  • 那么您需要检查该列是否存在于 products 表中,并且内部连接是否指向正确的表:)
  • 实际上,谢谢,在 Datagrid 绑定中,我写了错误的绑定名称,并且没有显示名称。所以现在它正在工作。非常感谢。
【解决方案3】:

不确定我是否正确理解了您的问题,但我相信对于您的查询,您正在寻找简单的东西,例如在 ProductsBatch 表之间加入:

SELECT
    P.P_id,
    P.P_name,
    B.batch_id,
    B.product_name,
    B.quantity,
    B.left_qty,
    B.purchaseDate,
    B.manufacturing_date,
    B.expiryDate
FROM Batch AS B
INNER JOIN Products AS P
ON B.p_id_fk = P.P_id
WHERE CONVERT(DATE, B.expiryDate, 103) BETWEEN @from AND @to

您提供的p_id_fk 名称可能不是Batch 表中的实际列名,而是按照命名约定(_fk 后缀)显示的外键约束本身的名称。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-24
    • 1970-01-01
    • 2017-07-09
    相关资源
    最近更新 更多