2015-12-02 55 views
0

我有一個SQLite數據庫有兩個表:SQL訂貨1的關係

一個
PK |名稱

B
PK | FK1 | FK2

在表B中,FK1和FK2都引用表A上的PK(實際上,只有一個實際上設置爲DB上的外鍵,但FK2中的值仍然取自表中所有PK的集合一個)。

表B的目的是允許非線性排序。這持有'下一個'關係。例如:

A
PK |名稱

1 |第一個
2 |秒
3 | Third

B
PK | FK1 | FK2

1 | 1 | 2
2 | 2 | 3

這表示從第一 - >第二 - >第三的線性流動。

我正在尋找從A排序結果的最佳方法。最佳情況下,將按照表B指定的順序生成線性流量。非線性流量會略有不同,但大部分應該按順序排列以相同的方式(除了平行路徑彼此相鄰)。

我迷惑了每一個我能想到的連接,並且SQLite不支持PL/SQL,這使得這個問題顯得更加困難。目前,我只是運行:

A left join B on A.PK = B.FK1 order by B.FK2. 

什麼是加入這些表的最佳方式,並命令結果?

+0

你希望他們在什麼順序? –

+0

我希望它們儘可能地接近表B中FK1和FK2列所描述的順序(顯然在某些情況下這是不可能的) –

+1

我認爲你需要的語法是''with recursive'' 。這應該允許您選擇任何起點並走樹。 –

回答

1
WITH RECURSIVE list AS (
    SELECT PK, Name 
    FROM A 
    WHERE PK = 1 
    UNION ALL 
    SELECT A.PK, A.Name 
    FROM list 
    JOIN B ON list.PK = B.FK1 
    JOIN A ON B.FK2 = A.PK 
) 
SELECT * FROM list; 
+0

這非常有幫助,謝謝!第一個select語句(其中pk = 1)中的where子句僅允許它返回單個記錄(id爲1的記錄),但是 –

+0

此查詢適用於您的示例數據。 –

+0

您是正確的先生,我需要弄清楚爲什麼它不能處理完整的數據。標記你的答案是正確的。謝謝! –