【问题标题】:JOINS or multiple queriesJOINS 或多个查询
【发布时间】:2025-11-25 04:25:01
【问题描述】:

我有一个 Orders 表和一个 Order_Details 表。

我需要选择一个订单及其所有相关详细信息。

使用两个 Select 语句(一个用于订单,一个用于详细信息)以及两个 SqlDataReaders 然后循环遍历这两个语句来填充我的 UI,是否最有效。

示例:
1.SELECT * FROM Orders Where orderid = 3; //将返回1条记录 在 UI 中显示结果。
2.SELECT * FROM Order_Details Where orderid = 3; //将返回x条记录 循环遍历结果并在同一 UI 中以列表格式显示

  • 或者-

我是否应该使用一个 select 语句和一个 SqlDataReader,但我当然会在每一行中返回大量额外数据。

示例
1.SELECT * FROM Orders LEFT JOIN Order_Details ON Order_Details.orderid = Orders.orderid WHERE Orders.orderid = 3;

在第二种情况下,我只访问数据库一次,但每一行都会包含来自两个表的数据。我认为第一种情况是要走的路。谁有更好的方法?

【问题讨论】:

    标签: c# mysql sql sql-server database


    【解决方案1】:

    在您的第一种情况下,会有两个问题。
    1. 它将有两次往返数据库,不建议增加Network traffic
    2. 考虑将两个结果都填写到datatable。当第二个查询失败时,您必须在 datatable 中应用逻辑来识别从哪个表中获取的记录。为此,您需要将所有内容合并到 Transaction

    SELECT * FROM Orders Where orderid = 3;
    SELECT * FROM Order_Details Where orderid = 3;
    

    最好使用第二种方式,因为那里只有一次往返。使用LEFT JOIN不会有太大问题;确保您的表有正确的Indexes

    SELECT * FROM Orders 
    LEFT JOIN Order_Details ON Order_Details.orderid = Orders.orderid 
    WHERE  Orders.orderid = 3;
    

    编辑:

    假设一个人需要从两列火车上挑选一些箱子。他需要从Train1 中选择一个编号为3 的框,他需要从Train2 中选择一些编号为3a3b 等的框,这些框按升序/降序排列。

    他需要穿过交通繁忙的城市才能到达火车站。如果他从Train1 中挑选一个编号为3 的盒子,去他家,将盒子丢在那里,回到火车站从Train2 中挑选编号为3a3b 等的盒子会怎样并再次回家丢弃3a,3b 框?

    由于流量很大,他需要花费太多时间。如果他家离火车站很近,而且他是在非高峰时间旅行,那将不是什么大问题。

    So coming to your tables - Why we need such round trips? 
    It would be good if you do it in one query. 
    

    现在考虑从火车站挑选 50 多个箱子。在这种情况下,将箱子装入他的车辆需要更多时间。

    So coming to your tables - The more number of columns 
    you select in the select query, the more time it will take. 
    For that also single query is advisable. 
    

    【讨论】:

    • 谢谢萨拉。每个 Order_Detail 行也将包含所有 Order 数据这一事实又如何呢?如果我需要获取 50 列 Order 数据,即每个 Order_Detail 行的 50 列额外数据。这比一个额外的数据库查询更可取吗?