2014-09-29 58 views
1

我目前從Oracle數據庫雲服務器(RIP :()遷移項目到SQL Server 2008SYS_CONNECT_BY_PATH在SQL Server中使用動態

我在Oracle中幾個查詢包含漂亮SYS_CONNECT_BY_PATH功能。

我的問題:我有把當前的數據

ORDER_ID ORDER_GROUP_ID OPERATOR_ID GROUP_NAME VALUE_ID DESCRIPTION 
-------------------------------------------------------------------------------------------------------------- 
1    10000   3   USER_ID  not null 'panel_id or msisdn_anonym of user' 
2    10000   3   MISSING_FLAG  0  'data for extrapolation are not missing' 
3    10000   3   MISSING_FLAG  1  'data for extrapolation are missing' 
5    10000   3   PANEL_FLAG  0  'source of user: no panel' 
5    10000   3   PANEL_FLAG  1  'source of user: panel' 
6    10000   3   ACTIVE_FLAG  0  'not active user' 
7    10000   3   ACTIVE_FLAG  1  'active user' 
1    10000   5   USER_ID  not null  'panel_id or msisdn_anonym of user' 
2    10000   5   MISSING_FLAG  0  'data for extrapolation are not missing' 
3    10000   5   MISSING_FLAG  1  'data for extrapolation are missing' 
5    10000   5   PANEL_FLAG  0  'source of user: no panel' 
5    10000   5   PANEL_FLAG  1  'source of user: panel' 
6    10000   5   ACTIVE_FLAG  0  'not active user' 
7    10000   5   ACTIVE_FLAG  1  'active user' 

我需要這樣的:

ORDER_GROUP_ID ORDER_ID OPERATOR_ID GROUP_NAME VALUE_DESCRIPTION 
--------------------------------------------------------------------------------------------- 
10000   1   3    USER_ID    [not null='panel_id or msisdn_anonym of user'] 
10000   3   3    MISSING_FLAG   [0='data for extrapolation are not missing'] [1='data for extrapolation are missing'] 
10000   5   3    PANEL_FLAG   [0='source of user: no panel'] [1='source of user: panel'] 
10000   7   3    ACTIVE_FLAG   [0='not active user'] [1='active user'] 
10000   1   5    USER_ID    [not null='panel_id or msisdn_anonym of user'] 
10000   3   5    MISSING_FLAG   [0='data for extrapolation are not missing'] [1='data for extrapolation are missing'] 
10000   5   5    PANEL_FLAG   [0='source of user: no panel'] [1='source of user: panel'] 
10000   7   5    ACTIVE_FLAG   [0='not active user'] [1='active user'] 

這裏是我們的Exadata當前使用的代碼:

SELECT 
    order_group_id, order_id, operator_id, group_Name, value_description 
FROM 
    (SELECT 
     order_id, operator_id, group_Name, level 
     , seq, cnt 
     , trim (REPLACE (SYS_CONNECT_BY_PATH(value_description, '#'), '#', ' ')) AS value_description 
     , order_group_id 
    FROM 
     (SELECT 
      order_id, operator_id, group_Name, VALUE_ID, description, '['||VALUE_ID||'='||description||']' AS value_description 
     , row_number() OVER (PARTITION BY operator_id, group_Name ORDER BY VALUE_ID, description) seq 
      , count(*) OVER (PARTITION BY operator_id, group_Name) cnt 
      , order_group_id 
     FROM 
      NIS_MDM.EPO_FUS_USER_GROUPS_V) 
    where level = cnt 
    start with seq = 1 
    CONNECT BY 
    PRIOR operator_id = operator_id and prior group_Name = group_Name 
    AND PRIOR seq = seq - 1 
) 
    order by operator_id, order_id 

我試圖用STUFF功能,甚至透視,但我不能得出一個正確的解決方案。

如果有人能幫助我,我會很開心。 我覺得我用不同的語言搜索整個互聯網,但沒有人解決或有我的一個陌生的問題。

+0

檢查我的答案,讓我們知道... – 2014-09-29 16:36:20

+0

幹得好克里希納拉拉納工作完美! 豎起大拇指 – 2014-09-30 07:13:02

回答

0

那麼,你可以試試這個查詢。

檢查它在SQL Fiddle

SELECT order_group_id 
    ,order_id 
    ,operator_id 
    ,group_Name 
    ,value_description 
FROM (
    (
     SELECT order_group_id 
      ,order_id 
      ,seq = row_number() OVER (
       ORDER BY operator_id 
        ,group_Name 
       ) 
     FROM MyTab 
     ) tab INNER JOIN (
     SELECT operator_id 
      ,group_Name 
      ,row_number() OVER (
       ORDER BY operator_id 
        ,group_Name 
       ) seq 
      ,STUFF((
        SELECT ' ' + '[' + VALUE_ID + '=' + [description] + ']' 
        FROM MyTab v 
        WHERE v.operator_id = A.OPERATOR_ID 
         AND v.GROUP_NAME = A.GROUP_NAME 
        FOR XML PATH('') 
         ,TYPE 
        ).value('.', 'NVARCHAR(MAX)'), 1, 1, '') AS value_description 
     FROM (
      SELECT order_id 
       ,operator_id 
       ,group_Name 
       ,VALUE_ID 
       ,description 
       ,order_group_id 
      FROM MyTab 
      ) a 
     GROUP BY operator_id 
      ,group_Name 
     ) t ON tab.seq = t.seq 
    ) 
0

我已經解決它通過創建數據庫功能

創建功能像「ufn_GetParentPath」用它代替「SYS_CONNECT_BY_PATH 「傳遞order_id作爲參數。

CREATE FUNCTION [dbo].[ufn_GetParentPath] (@pCurrentNodeID INT) 
RETURNS VARCHAR(1000) 
    AS 
BEGIN 

DECLARE @vCurrentNodeName  VARCHAR(50) 
DECLARE @vParentID   INT 

IF @pCurrentNodeID IS NULL OR @pCurrentNodeID = 0 
    RETURN NULL 

SELECT @vCurrentNodeName = [VALUE_DESCRIPTION], @vParentID = [operator_id] 
FROM [NIS_MDM].[EPO_FUS_USER_GROUPS_V] 
WHERE [order_id] = @pCurrentNodeID 

RETURN ISNULL([dbo].[ufn_GetParentPath] (@vParentID) + '/', '') + @vCurrentNodeName 

END 
GO