2011-01-13 54 views
0

我目前使用Access並使用ODBC鏈接表連接到MySQL數據庫。這是一個食譜數據庫概念,最終可能會生效。我們使用嵌套集模型存儲「標籤」,然後使用聯結表將它們鏈接到食譜。我寫了一條SQL語句,顯示給定配方的所有已分配標籤的完整路徑。但是,由於語句中的邏輯,它顯示的標籤只有兩層。這可以改善嗎?它可以在MySQL中完成,但不能在Access中完成?我知道我已經在選擇使用IIF語句進行基本比較的字段中使用了一些僅限Access的代碼。改進此嵌套集「完整路徑」SQL語句 - 不返回所有記錄

SELECT recipelabel.labelid, parent1.lbltext+' > '+IIf(parent2.lbltext<>node.lblText,parent2.lbltext+' > ','')+IIf(parent3.lbltext<>node.lblText,parent3.lbltext+' > ','')+node.lbltext AS LabelPath 
FROM labels AS parent1, labels AS parent2, labels AS parent3, recipelabel INNER JOIN labels AS node ON recipelabel.labelid=node.id 
WHERE node.lft Between parent1.lft And parent1.rgt And node.lft Between parent2.lft And parent2.rgt And node.lft Between parent3.lft And parent3.rgt And parent1.nodelevel=1 And parent2.nodelevel=2 And parent3.nodelevel=3 And recipelabel.recipeid=4; 

這將返回以下:

Course > Breads > Buns 
Ingredients > Fruit > Berries > Raspberries 

應該返回如下:

Course > Breads > Buns 
Cuisine > German 
Event/Occasion > Breakfast 
Ingredients > Fruit > Berries > Raspberries 

基本上我想出的唯一的解決辦法是迫使所有的標籤是沒有深度超過3級,並強制用戶始終分配至少2級深度的標籤。有沒有使用我忽略的SQL的解決方案?

+0

我沒有提到我通過將節點級別存儲在數據庫中而在傳統嵌套集合模型之外冒險。這個查詢是唯一可能的,因爲這個,除非你有另一種方法可行。 – HK1 2011-01-13 16:23:56

回答

1

移動您的連接表達式以加入子句並執行左連接

例如,

FROM 
    labels AS parent1, 
    labels AS parent2, 
    recipelabel 
    INNER JOIN labels AS node 
    ON recipelabel.labelid=node.id 
    LEFT JOIN labels AS parent3 
    ON node.lft Between parent3.lft And parent3.rgt 
     And parent3.nodelevel=3 

UPDATE我錯過了加盟條件And parent3.nodelevel=3

你可以把它放在哪裏,如果你想,但那麼你就必須將它更改爲

And (parent3.nodelevel=3 
    or parent3.nodelevel is null) 

我已經在其他數據庫上測試過它並且它可以工作(我沒有MYSQL) 但是,這受到documentation的支持

具體

join_condition:

ON conditional_expr | USING (column_list). 

與所使用的conditional_expr是 可以WHERE子句中使用的形式 的任何條件表達式。 通常,您應該使用ON 子句中的條件來指定 如何連接表,並使用WHERE子句 來限制 結果集中您想要的行。

+0

我收到一個錯誤。下面是確切的錯誤消息:查詢表達式'recipelabel.labelid = node.id中的語法錯誤(缺少運算符)LEFT JOIN標籤AS parent3 ON node.lft BETWEEN parent3.lf'。 – HK1 2011-01-13 16:42:23