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

标签 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'  

最佳答案

可能最有效的方法是:

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) 上建立索引。

关于sql - 如何在单个选择中区分具有相似值的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30384732/

相关文章:

MySQL 查询结果和

mysql - 多个 'IN' 子句

Powershell计划作业中的Sql查询无法运行

sql - 如何使用分层子查询构建层次结构路径

oracle - 插入时可以在表上创建索引

mysql - 如何修复具有指定表两次错误的 SQL 查询

sql - PL/SQL 对具有相同 ID 的行进行编号

sql - 有没有办法做一个唯一的引用

oracle - 为什么当我从当前日期减去一年时出现 Oracle 错误?

java - oracle数据库客户端安装位置里面的JDK有什么用处?