【问题标题】:How to join two table so that result contains values from second table in between values of first table如何连接两个表,以便结果包含第二个表中的值在第一个表的值之间
【发布时间】:2014-11-07 06:54:46
【问题描述】:

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 相互关联,表 1 中的 PID 有两个不同的值,例如 1 表示开始,2 表示结束。基于此,带有 1 的 PNO 应该首先出现,而带有 2 的 PNO 应该最后出现。

【问题讨论】:

    标签: c# mysql oracle join


    【解决方案1】:

    “在 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 的方式。如果您按照我的开头段落行事,这还取决于您应用了哪些进一步的过滤器。

    【讨论】:

    • 表 1 中的 PID 有两个不同的值,例如 1 表示开始,2 表示结束。基于此,PNO 应为 1,PNO 为 2 应排在最后。
    • 这仍然不清楚。请使用一些实际示例数据而不是伪值来编辑您的问题。
    猜你喜欢
    • 1970-01-01
    • 2019-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    • 1970-01-01
    • 2021-08-23
    相关资源
    最近更新 更多