如何在单个选择中区分具有相似值的行?

时间:2015-05-21 21:32:02

标签: sql oracle

我在表格中得到了这样的行:

PRODUCTID | NAME  | LOCATION  | PRICE 
   1          X        R         5
   1          X        C         4.5
   2          Y        R         5
   3          Z        C         4.5

如您所见,该表可以包含相同的产品,但位于不同的位置。所有产品都在“R”位置,但有时产品可以在R和C位置,价格不同。

我想要的是,如果产品位于R和C两个位置,只获得位置C,但如果它只在R位置,那么只需得到R。

我怎样才能完成这个?

我尝试过使用子查询:

SELECT *
FROM ProductLocation t
WHERE EXISTS (
  SELECT *
  FROM ProductLocation 
  WHERE 
     LOCATION not in ('R')
)
and t.PRODUCTID='1'  

2 个答案:

答案 0 :(得分:2)

可能最有效的方法是:

select pl.*
from ProductLocation pl
where pl.location = 'C'
union all
select pl.*
from ProductLocation pl
where pl.location = 'R' and
      not exists (select 1
                  from ProductLocation pl2
                  where pl2.productId = pl.productId and
                        pl2.location = 'C'
                 );

为了提高性能,您需要ProductLocation(location)ProductLocation(productId, location)上的索引。

答案 1 :(得分:2)

我认为这也可能有用:

select * from
(select p.*, row_number() over
 ( partition by productid, name 
   order by case when location = 'C' then 1 else 2 end) rnum
from productlocation p)
where rnum = 1

SQLFiddle