我在表格中得到了这样的行:
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'
答案 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