2013-05-03 41 views
0

我有一個SQL Azure表,其中包含組件和零件的信息。我需要編寫一個存儲過程,以返回給定組件的正確零件列表。但是,某些行需要被「覆蓋」這一事實很複雜。SQL Azure存儲過程SELECT行可能被覆蓋

我的表如下所示:

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最具體的部分,你可以找到。即基本版本可能是可用的,但其他版本可能優先。然後我需要忽略除最具體版本之外的所有內容。

我寫的存儲過程不起作用。該貼片應該取一個組件ID,一個區域和一個城市,並按照它們的位置順序返回適當的組件。所以,下面的例子應該成立:

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 

我沒有我的失敗的存儲過程的代碼的手,但可以在幾個小時內,將其固定...

回答

2

爲了能夠重用結果,我會創建一個函數而不是存儲過程。如果你真的想要一個SP,你可以在下面創建的函數中使用查詢。

SQL Fiddle

架構設置

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 | 
+0

太棒了,它的工作原理。一個更正...我需要在「從tbl」 - 「其中ComponentID = @ComponentID」之後添加一個子句。否則發現。謝謝你的幫助! – gordonm 2013-05-03 20:16:44

相關問題