加入或多个查询

时间:2015-01-31 05:57:25

标签: c# mysql sql sql-server database

我有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;

在第二种情况下,我只打了一次数据库,但每行都有来自其中两个表的数据。我假设第一种情况是要走的路。谁有更好的方法?

1 个答案:

答案 0 :(得分: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;

编辑:

考虑一个需要从两列火车上挑选一些箱子的人。他需要从3中选择一个编号为Train1的复选框,他需要从Train2中选择一些带有3a3b等数字的方框。按升序/降序排列。

他需要穿过交通拥堵的城市才能到达火车站。如果他从3中挑选一个编号为Train1的方框,会去他家,将邮箱放在那里,然后回到火车站从Train2挑选带有3a的方框,会发生什么? 1}},3b等再次返回主页以删除3a3b框?

由于交通拥堵,他需要花太多时间。如果他的房子靠近火车站并且他在非高峰时间旅行,那将不会是一个大问题。

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.