0

コンポーネントとパーツの情報を含む SQL Azure テーブルがあります。特定のコンポーネントのパーツの正しいリストを返すストアド プロシージャを作成する必要があります。ただし、特定の行を「オーバーライド」する必要があるため、複雑です。

私のテーブルは次のようになります。

ComponentID | Position | PartID | Area    | City   |
------------+----------+--------+---------+--------+
3           | 1        | F      | Europe  | None   |
3           | 1        | G      | England | None   |
3           | 1        | S      | England | London |
3           | 2        | H      | Europe  | None   |
3           | 2        | I      | England | None   |
3           | 3        | Q      | Europe  | None   |

ここでの「オーバーライド」とは、ある場所についてより具体的な場合は、位置 X で見つけられる最も具体的な部分の詳細を取得する必要があるということです。つまり、基本バージョンが利用できる場合がありますが、他のバージョンが優先される場合があります。次に、最も具体的なバージョン以外はすべて無視する必要があります。

私が書いたストアド プロシージャが機能しません。sproc は、componentID、エリア、都市を受け取り、適切なコンポーネントを位置順に返す必要があります。したがって、次の例が成り立つはずです。

Input: 3, Europe, None:

1 F
2 H
3 Q

Input: 3, England, None:

1 G
2 I
3 Q

Input: 3, England, London: 

1 S
2 I
3 Q

失敗した sproc コードは手元にありませんが、数時間で添付できます...

4

1 に答える 1

2

結果を再利用できるようにするには、ストアド プロシージャの代わりに関数を作成します。本当に SP が必要な場合は、以下で作成する関数内でクエリを使用できます。

SQL フィドル

スキーマのセットアップ:

create table tbl (
ComponentID int, Position int, PartID char(1), Area sysname   , City sysname );
insert into tbl select
3           , 1        , 'F'      , 'Europe'  , 'None'   union all select
3           , 1        , 'G'      , 'England' , 'None'   union all select
3           , 1        , 'S'      , 'England' , 'London' union all select
3           , 2        , 'H'      , 'Europe'  , 'None'   union all select
3           , 2        , 'I'      , 'England' , 'None'   union all select
3           , 3        , 'Q'      , 'Europe'  , 'None';

create function dbo.getComponents(
  @ComponentID int,
  @Area sysname,
  @City sysname)
returns table as return
with ranked as (
  select Position, PartID, rownum = row_number() over
    (partition by Position order by
     case when @Area=Area and @City=City then 1
          when @Area=Area then 2
          else 3 end)
    from tbl
)
select Position, PartID
from ranked
where rownum=1
GO

クエリ 1 :

select * from dbo.getComponents(3, 'Europe', 'None') order by PartID

結果

| POSITION | PARTID |
---------------------
|        1 |      F |
|        2 |      H |
|        3 |      Q |

クエリ 2 :

select * from dbo.getComponents(3, 'England', 'None') order by PartID

結果

| POSITION | PARTID |
---------------------
|        1 |      G |
|        2 |      I |
|        3 |      Q |

クエリ 3 :

select * from dbo.getComponents(3, 'England', 'London') order by PartID

結果

| POSITION | PARTID |
---------------------
|        2 |      I |
|        3 |      Q |
|        1 |      S |
于 2013-05-03T12:10:53.670 に答える