2013-10-03 24 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 

游标的文档可以被发现在控制逻辑来应用你的规则,甚至嵌套游标来获得所需的结果。文档中有更多示例。