TABLE 1 (ID,PID,PNO)
包含例如的起点和终点; (A,B)。主键(ID,PID)外键(ID)
TABLE 2 (ID,PNO)
按顺序包含中间点信息(a1,a2 ... bn-1,bn)。主键(ID)
我试图以这样的方式加入他们,我可以得到[A,a1,a2 ... bn-1,bn,B]。
我使用
获取数据SELECT PNO FROM TABLE2 WHERE ID= 123 UNION SELECT PNO FROM TABLE1 WHERE ID= 123
并通过获取所有数据然后添加条件并重新排序来在C#代码中尝试它。这种尝试有两个很长的时间。
除此之外,有一种方法可以连接这两个表来获取结果集。
注意:这些表通过公共字段ID相互关联,而TABLE1中的PID有两个不同的值,例如1表示开始,2表示结束。基于此,具有1的PNO应该首先出现,而具有2的PNO预计将结束。
答案 0 :(得分:0)
“通过获取所有数据,然后添加条件并重新排序它们,在C#代码中尝试了它”。
这通常是一个非常糟糕的主意,特别是如果你有很多网络活动。 SQL非常擅长操作数据:实际上它针对该任务进行了优化。因此,尝试将条件作为WHERE子句传递给数据库,使用ORDER BY对最终结果集进行排序并仅返回所需的行。如果原始数据库集和最终C#集中的行数之间存在较大差异,则可能会对总耗用时间产生很大影响。
其他事情。如果您仍然觉得这个太慢,那么您就会遇到标准的调整问题。您没有提供任何必要的硬信息来提供明确的解决方案,所以这里有一些猜测。
您需要ID的所有记录,因此没有更有效的方法来连接两个中间结果集以获得最终集。但是如果这两个集合是独占的 - 也就是说,如果Table1
中的端点不包含在Table2
的点中(你的问题还不完全清楚) - UNION ALL会更多高效:
SELECT PNO FROM TABLE2 WHERE ID= 123
UNION ALL
SELECT PNO FROM TABLE1 WHERE ID= 123
这是因为UNION进行了额外的操作来生成一组不同的值。跳过该步骤将为您节省一些时间。
table2 ( ID, PNO)
上的索引可以避免触及表格,从而加快检索时间。是否值得维护索引的开销取决于您希望运行此查询的频率以及加载Table2
的方式。如果您对我的开头段落采取行动,它还取决于您应用的进一步过滤器。