簡體   English   中英

如何聯接兩個表,以便結果包含第一個表的值之間的第二個表的值

[英]How to join two table so that result contains values from second table in between values of first table

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表示結束。 基於此,PNO應當以1為先,而PNO則應以2為末。

“通過獲取所有數據,然后添加條件項並對它們重新排序,在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 ( ID, PNO)可以完全避免觸摸表,從而加快了檢索速度。 維護索引是否值得進行開銷取決於您要運行該查詢的頻率以及加載Table2 如果您對我的開頭段落進行操作,這還取決於您應用了哪些進一步的過濾器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM