2013-10-03 26 views
0

鑑於以下類型的表,如何在SQL中遞歸地構建產品列表?

create table products (
    productid varchar(10), 
    make varchar(10), 
    age varchar(10), 
    colour varchar(10), 
    category1 varchar(10), 
    category2 varchar(10), 
    caregory3 varchar(10) 
    ) 

我想選擇的產品列表(所有字段),但應該每make只有一個產品。爲每個make選擇的產品應通過按順序應用一組規則來確定。例如, - 如果存在屬於特定make的紅色產品,請選擇該產品。 - 對於尚未呈現的所有make,請選擇一款不到兩年的產品。 - 對於所有make尚未表示,選擇一個產品,它是X 1類價值 - 排泄物

您可以通過保持所選產品的一些內存/臨時表做到這一點,並插入到這個表中的其他產品,只有當它還不包含潛在的產品。通過爲每個規則應用一個insert select into以便填充內存/臨時表。例如。

insert into #temp 
select productid, make, age, colour, category1, category2, caregory3 
from products a 
where *rule applies* 
and a.make not exists in (select make from #temp where a.make = #temp.make) 

但是,這看起來不太優雅。

注意:這是對實際問題的簡化。在實際問題中,每個選擇級別上只能有一個有效的產品。

回答

2

我認爲這會爲你工作:

SELECT * FROM 
(
    SELECT *, RANK() OVER (PARTITION BY p.make ORDER BY 
    CASE 
     WHEN colour = 'red' THEN 1 
     WHEN age < '2' THEN 2 
     WHEN category1 = 'x' THEN 3 
     ELSE 4 
    END) as priority 
    FROM products p 
) ranked 
WHERE priority = 1 
0

光標可被用於此,結合表變量來存儲選定的產品:http://technet.microsoft.com/en-us/library/ms180169.aspx

然後,可以使用附加的流動:

DECLARE @selected_products table(
    productid varchar(10), 
    make varchar(10), 
    age varchar(10), 
    colour varchar(10), 
    category1 varchar(10), 
    category2 varchar(10), 
    caregory3 varchar(10) 
) 

DECLARE @current_make varchar(10) 

DECLARE make_cursor CURSOR 
    FOR SELECT DISTINCT make FROM products 

OPEN make_cursor 

FETCH NEXT FROM make_cursor INTO @current_make 

WHILE @@FETCH_STATUS = 0 
BEGIN 

    DECLARE @red_product_count int 

    SELECT @red_product_count = COUNT(productid) 
    FROM products 
    WHERE colour = 'red' 

    IF @red_product_count > 0 
    BEGIN 

     SELECT TOP 1 productid, make, age, colour, category1, category2, category3 
     INTO @selected_products 
     FROM products 
     ORDER BY some_field 

    END 

END 
CLOSE make_cursor 
DEALLOCATE make_cursor 

遊標的文檔可以被發現在控制邏輯來應用你的規則,甚至嵌套遊標來獲得所需的結果。文檔中有更多示例。