【问题标题】:SQL Query for returning only 1 record with 2 conditions satisfiedSQL 查询仅返回满足 2 个条件的 1 条记录
【发布时间】:2016-07-29 20:39:19
【问题描述】:
 WHERE (ADDR1 = '1500 Valley Rd' AND CUST_FLAG = 'P')     -- 1
    OR (ADDR1 = '1500 Valley Rd' AND CUST_FLAG = 'J')     -- 2

请帮我解决这个问题。我只需要显示CUST_FLAG = 'P' 的记录。使用上面的 Where 子句,如果两个条件都满足,我将获得两条记录。 我的要求是:

  1. 如果仅满足第一个条件,则返回带有CUST_FLAG = 'P' 的记录
  2. 如果仅满足第二个条件,则返回带有CUST_FLAG = 'J' 的记录
  3. 如果两个条件都满足,则只返回CUST_FLAG = 'P'的记录。

【问题讨论】:

  • 什么“第二个条件”?里面有 4 种不同的比较。
  • 我的意思是 OR 之前和之后的语句。 ADDR1 = '1500 Valley Rd' AND CUST_FLAG = 'P' 为 1 ADDR1 = '1500 Valley Rd' AND CUST_FLAG = 'J' 为 2

标签: sql oracle oracle12c


【解决方案1】:

这是一个优先级查询。要在单个 where 子句中执行此操作,您可以:

WHERE ADDR1 = '1500 Valley Rd' AND
      (CUST_FLAG = 'P' OR
       (CUST_FLAG = 'J' AND
        NOT EXISTS (SELECT 1 FROM t WHERE t.ADDR1 = outer.ADDR1 AND t.CUST_FLAG = 'J'
       ))

或者更典型的方式是使用ROW_NUMBER()

select t.*
from (select t.*, row_number() over (partition by addr1 order by cust_flag desc) as seqnum
      from (<your query here>) t
     ) t
where seqnum = 1;

【讨论】:

  • 或者,使 ORDER BY 条件对 P 和 J 的事故的依赖性稍微降低:order by case cust_flag when 'P' then 0 when 'J' then 1 end - 至少这可以清楚地说明意图是什么。
【解决方案2】:

试着玩转case/when

case 
  when ADDR1 = '1500 Valley Rd' AND CUST_FLAG = 'P' then 'P'
  when ADDR1 = '1500 Valley Rd' AND CUST_FLAG = 'J' then 'J'
  else 'P' end

【讨论】:

    【解决方案3】:

    您可以通过对记录进行排序并只取第一个来实现这一点。 (但请注意,ROWNUM 可能是 Oracle 特定的语法。)

    SELECT * FROM (
    SELECT <column_list> 
    FROM <table>
    WHERE ((ADDR1 = '1500 Valley Rd' AND CUST_FLAG = 'P')     -- 1
        OR (ADDR1 = '1500 Valley Rd' AND CUST_FLAG = 'J'))     -- 2
    ORDER BY CUST_FLAG DESC
    ) WHERE ROWNUM = 1
    

    从 Oracle 12c 开始,以下语法也是可能的:

    SELECT <column_list> 
    FROM <table>
    WHERE ((ADDR1 = '1500 Valley Rd' AND CUST_FLAG = 'P')     -- 1
        OR (ADDR1 = '1500 Valley Rd' AND CUST_FLAG = 'J'))     -- 2
    ORDER BY CUST_FLAG DESC
    FETCH FIRST 1 ROWS ONLY;
    

    另请参阅: - On ROWNUM and Limiting Results - How do I limit the number of rows returned by an Oracle query after ordering?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-10
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      • 2016-05-19
      • 2016-12-28
      相关资源
      最近更新 更多