我有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
;
在第二种情况下,我只打了一次数据库,但每行都有来自其中两个表的数据。我假设第一种情况是要走的路。谁有更好的方法?
答案 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
中选择一些带有3a
,3b
等数字的方框。按升序/降序排列。
他需要穿过交通拥堵的城市才能到达火车站。如果他从3
中挑选一个编号为Train1
的方框,会去他家,将邮箱放在那里,然后回到火车站从Train2
挑选带有3a
的方框,会发生什么? 1}},3b
等再次返回主页以删除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.