1

SQLServerで順序の問題があります。

私の結果セットは、プライマリ列とセカンダリ列の結果セットです。二次列は、一次列の子ノードを参照します。たとえば、結果セットの後半に表示される一次列のIDです。

Primary Column | Secondary Column
1                  NULL
1                  2
1                  3
3                  NULL
3                  NULL
2                  NULL
2                  NULL
2                  7

SQL SELECTをプライマリ列で並べ替える必要がありますが、セカンダリ列がある場合は、そのIDに関連する行をプライマリ列の下に挿入します。たとえば、上記の結果セットは次のようになります。

Primary Column | Secondary Column
1                  NULL
1                  2
2                  NULL
2                  NULL
2                  7
1                  3
3                  NULL
3                  NULL

これは、CURSORを使用せずにSQLで可能ですか?

4

2 に答える 2

2

これを行う 1 つの方法は、自己結合を使用することです。

select primary, secondary
from (select t.primary, t.secondary,
             max(case when tsub.primary is not null then 1 else 0 end) as hasprimary
      from t left outer join
           t tsub
           on t.secondary = t.primary
      group by t.primary, t.secondary
     ) a
order by (case when hasprimary = 1 then secondary else primary end),
         hasprimary desc,
         secondary

これは、一致する行があるかどうかに基づいて、最初に使用する ID (プライマリまたはセカンダリ) を計算します。2 番目の句は、「異常な」ものを最初に配置し、その後に残りを配置します。

于 2012-07-26T11:11:41.280 に答える
2

これを試して:

with cte as (select *,ROW_NUMBER() over(partition by Primary_Column order by isnull(Secondary_Column,0)) as rownum 
    from test_order
    where Secondary_Column is null or Secondary_Column not in (select Primary_Column from test_order)
), 
cte1 as (
    select *,ROW_NUMBER() over(partition by Secondary_Column order by isnull(Primary_Column,0))-1 as rownum
    from test_order
    where Secondary_Column  in (select Primary_Column from test_order)
),
cte2 as (select 'c1' [type],* from cte
    union all
    select 'c2' [type],* from cte1)
    select Primary_Column,Secondary_Column from cte2
    order by case when [type]='c1' then Primary_Column 
                                else Secondary_Column end,rownum

SQL フィドルのデモ

于 2012-07-26T09:31:26.680 に答える