2011-08-09 23 views
2

我在SQL Server中的表包含以下幾列:如何在levelOrder值上搜索un SQL?

Id Name  ParentId LevelOrder 
8 vehicle 0   0/8/ 
9 car  8   0/8/9/ 
10 bike  8   0/8/10/ 
11 House 0   0/11/ 
... 

這將創建一個樹。

說我有LevelOrder 0/8/,這應該只返回汽車和自行車行,但我該如何處理SQL Server?

我曾嘗試:

Select * FROM MyTable WHERE LevelOrder >= '0/8/' 

,但不起作用。

+0

你只想要直接的孩子(在這種情況下使用'where parentId = 8')還是所有的下游節點?那就是,你想要一輛山地自行車嗎?(12,mountainBike,10,0/8/10/12)'回來了? –

+0

什麼樣的數據類型是'LevelOrder'?串? –

+0

@ X-Zero>是的,我不僅需要直接子節點,還需要下游節點。 – Banshee

回答

3

下劃線字符將保證'0/8 /'之後至少有一個字符出現,所以您不會在「車輛」行中找到匹配。

SELECT * 
    FROM MyTable 
    WHERE LevelOrder LIKE '0/8/_%' 
+0

謝謝,我們每天都在學習新事物 – NeedAnswers

0

此代碼允許您選擇與0/8/

Select * FROM MyTable WHERE LevelOrder like '0/8/%' 
+0

這也會匹配「車輛」行,不應該包括在內。 –

0

好的開始值 - 雖然@喬的答案是比我對最簡單和最容易實現的(也可能是更好的執行 建議...),更新異常有一些問題。
具體做法是:

  1. 你已經有一個parentId列。您需要同步該列和levelOrder列,否則可能導致數據不一致。 (我相信這也違反了1NF,雖然我對準確定義的理解有點粗略......)
  2. levelOrder包含整個層次。如果任何一個家長被移動,所有子行都必須修改levelOrder才能反映(可能非常混亂)。

鑑於此,這裏是我的建議:

  1. 刪除該levelOrder列,因爲它的存在會(一般)引起的問題。
  2. 使用遞歸CTE和parentId列動態構建heirarchy。將列保留在原來的位置,或將其移至專用的關係表中。移動一個父代然後只需要更新一個單元格,並且不會導致任何(數據,非語義)異常。該CTE應該類似於這種形式(將需要爲目的進行調整):
    WITH heir_parent (parentId, id) as (SELECT parentId, id FROM table WHERE id = UNION ALL SELECT b.parentId, b.id FROM heir_parent as a JOIN table as b ON b.parentId = a.id)

目前,該CTE返回給定ID的所有兒童的名單,與他們的ID及其直屬家長。它可以調整以返回其他一些東西 - 儘管我建議CTE僅用於生成關係,並通過外部連接來獲取剩餘數據。