Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 内部联接根据IF-THEN-ELSE语句从第二个表中仅选择一行_Sql_Oracle - Fatal编程技术网

Sql 内部联接根据IF-THEN-ELSE语句从第二个表中仅选择一行

Sql 内部联接根据IF-THEN-ELSE语句从第二个表中仅选择一行,sql,oracle,Sql,Oracle,我有一张用户表。每个记录在付款表中都有一个或多个价格、日期和状态。我只想通过这个优先级来展示: priority 1 => green (with older date) priority 2 => green (with new date) priority 3 => yellow (with older date if amount>1000) 用户表 ╔════╦══════════════╗ ║ id ║ name ║ ╠════╬════

我有一张用户表。每个记录在付款表中都有一个或多个价格、日期和状态。我只想通过这个优先级来展示:

 priority 1 => green (with older date)
 priority 2 => green (with new date)
 priority 3 => yellow (with older date if amount>1000)
用户表

╔════╦══════════════╗
║ id ║  name        ║
╠════╬══════════════║
║  1 ║ Jeff_1       ║
║  2 ║ Jeff_2       ║
║  3 ║ Jeff_3       ║
╚════╩══════════════╝
付款表

╔═══════════════════════════════════╗
║ user_id  state  price    date     ║
╠═══════════════════════════════════╣
║ 1       green   5000   2019-10-14 ║
║ 1       green   3500   2019-10-11 ║
║ 1       yellow  1000   2019-10-09 ║
║ 2       yellow  50     2019-10-06 ║
║ 2       yellow  4000   2019-10-25 ║
║ 3       yellow  45900  2019-10-02 ║
║ 3       yellow  4000   2019-10-29 ║
╚═══════════════════════════════════╝
金额=>1000

我想要的是:

╔═══════════════════════════════════╗
║ user_id  state  price    date     ║
╠═══════════════════════════════════╣
║ 1       green   3500   2019-10-11 ║
║ 2       yellow  4000   2019-10-25 ║
║ 3       yellow  45900  2019-10-02 ║
╚═══════════════════════════════════╝
使用
行编号()


这假设您只需要这三个优先级。也就是说,如果没有匹配的行,则不需要用户。

使用以下脚本:

select u.user_id, payment.state, payment.price, payment.date 
from users u
outer apply(select top 1 * from payments p 
            where p.user_id = u.user_id
            and (p.state = 'green' or (p.state = 'yellow' and p.price > 1000))
            order by p.date)payment

如果我正确理解了您的问题,您希望返回3个查询的结果,每个查询都获得具有给定优先级的记录,因此

(select ..., 1 as priority from ...
union all
select ..., 2 as priority from ...
union all
select ..., 3 as priority from ...)
order by priority

您需要使用以下分析函数

select t.*
from 
  (select t.*,
    row_number() 
      over (partition by user_id 
        order by state, case when state= 'yellow' and price >1000 then 1 end desc, date) as rn
    from payments t
   where state = 'green' or
    (state = 'yellow' and amount > 1000) 
  )t
where rn = 1;

干杯

这是MySQL或Oracle数据库的问题,因为它们是不同的产品(尽管两者都属于Oracle公司)。不要使用不相关的标记来回答您的问题。我删除了Mysql,因为您的一条评论说您使用Oracle。@MT0您是对的,我按预期更新了我的答案。仍然不确定它是否正确,因为无论优先级如何,
排序依据将给出日期最高的行。它应该按绿色、黄色、最低(不是最高)日期顺序订购。@MT0我首先检查绿色状态,以便给它更高的优先级,如果没有绿色,则检索带价格条件的黄色。否,您没有额外的数据行,对于
id
1,您应该返回
green
,但返回
yellow
行。此外,MySQL或Oracle都不支持
TOP
语法,MySQL也不支持
OUTER APPLY
。如果您想要Oracle解决方案(对于Oracle 12c或更高版本,因为该版本支持
OUTER APPLY
仅获取第一行
),请从此点获取错误=>order by(state='green'))sql oracle developer中的desc=>从state='green'或(state='yellow'和delegation>1000)的states中选择delegation,state,row_number()(按sso分区,按顺序按(state='green')desc创建,在asc)作为tl@behzadomidi。我使用了MySQL语法,因为问题被标记为MySQL.answer in oracle=>选择state,date,row_number()over(state='green'时按用户分区,按大小写顺序,state='yellow'时按1,state='yellow'时按2,否则3 end,date asc)作为付款的tl,其中state='green'或(state='yellow'和delegation>1000)
select t.*
from 
  (select t.*,
    row_number() 
      over (partition by user_id 
        order by state, case when state= 'yellow' and price >1000 then 1 end desc, date) as rn
    from payments t
   where state = 'green' or
    (state = 'yellow' and amount > 1000) 
  )t
where rn = 1;