检查某个行是否存在,否则选择不同的行

b10*_*101 2 sql oracle

假设我有一个包含的表

|vendor  | price| productID|  
|--------------------------------|  
|abc   | 6    | 0001     |     
|1     | 7    | 0001     |         
|def   | 8    | 0001     |      
|xyz   | 30   | 0002     |    
|zxy   | 32   | 0002     |       
Run Code Online (Sandbox Code Playgroud)

现在我想得到一个产品的min()价格的供应商,
产品0001 的产品是供应商abc
,供应商xyz

但!如果有一个名为1的供应商,我希望看到他的名字而不是实际供应商的min()价格,如果产品没有名为1的供应商,我希望看到具有min()价格的供应商再次

如果这对你有意义..它有点像if-else结构,但我不知道如何在SQL中做到这一点

(抱歉格式化的表格很糟糕,我只是不按正确方式格式化)

谢谢

Gor*_*off 5

这是优先级查询.一种方法是使用row_number()并将优先级的规则放入order by.由此产生的查询:

select t.*
from (select t.*,
             row_number() over (partition by productId
                                order by (case when vendorid = 1 then 1 else 2 end),
                                         price asc
                               ) as seqnum
      from t
     ) t
where seqnum = 1;
Run Code Online (Sandbox Code Playgroud)