2016-09-27 58 views
0

檢索我有一個SQL視圖,類同以下之一:SQL Server查詢到所有從View

map_id | type_id | path 
    1   1   0 
    2   2   0 
    3   3   0 
    4   1   A>B 
    5   1   A>B>C 
    6   2   T>Z 
    7   2   T>Z>X 
    8   3   U 
    9   3   X>Y 
    10   1   D 

而另一張表,tblRoles

role_group_id | type_id | map_id 
1    1   1 
2    1   4 

我想建立一個查詢,將包括所有map_id其中role_group_idmap_id = 1和其餘它應該只得到相應的map_id

因此,查詢結果笑uld看起來像:

role_group_id | type_id | map_id | path 
1    1   4   A>B 
1    1   5   A>B>C 
1    1   10  D 
1    1   1   0 
2    1   4   A>B 

有人能指出我正確的方式嗎? 謝謝!

+1

我無法看到的格局在你預期的結果 – Sherlock

+0

基本上,tblRoles我想有添加單獨的行TYPE_ID至極的自由會被詢問從取景TYPE_ID所有的行..這就像在map_id = 1時選擇所有,並且如果map_id不同,請從視圖 – rosuandreimihai

+0

中只選擇相應的行,但問題是爲什麼'1 1 0'不包含在結果中?也許是因爲它有一個'0'的路徑?它有一個類型ID爲1,地圖ID爲1 – Sherlock

回答

1

沒有測試尚未,我希望這應該工作。

SELECT r.role_group_id 
     ,r.type_id 
     ,sv.map_id 
     ,sv.path 
FROM tblRoles r 
LEFT JOIN sampleView sv ON r.type_id = sv.type_id 
WHERE r.map_id = 1 
UNION 
SELECT r.role_group_id 
     ,r.type_id 
     ,r.map_id 
     ,sv.path 
FROM tblRoles r 
INNER JOIN sampleView sv ON r.map_id = sv.map_id 
WHERE r.map_id <> 1 
+0

它的工作原理!非常感謝! – rosuandreimihai

+0

@rosuandreimihai你的歡迎:) – Sherlock

0

您可以使用UNION

@rosuandreimihai:選擇所有當MAP_ID = 1,如果MAP_ID是不同的,只選擇 相應行

DECLARE @CurrentMapId INT = 1 

SELECT * FROM FirstTable 
WHERE 
    TYPE_ID IN 
    (
     SELECT r.type_id FROM tblRoles r 
     WHERE   
      map_id = @CurrentMapId 
    ) 
UNION 
SELECT * FROM FirstTable 
WHERE 
    map_id IN 
    (
     SELECT r.map_id FROM tblRoles r 
     WHERE   
      @CurrentMapId = 1 OR 
      map_id = @CurrentMapId 
    )