SQL满足2个条件只返回1条记录的查询
SQL Query for returning only 1 record with 2 conditions satisfied
WHERE (ADDR1 = '1500 Valley Rd' AND CUST_FLAG = 'P') -- 1
OR (ADDR1 = '1500 Valley Rd' AND CUST_FLAG = 'J') -- 2
请帮我解决这个问题。我只需要显示 CUST_FLAG = 'P'
的记录。使用上面的 Where 子句,如果两个条件都满足,我将获得两个记录。
我的要求是:
- 如果只有第一个条件满足,则return记录
CUST_FLAG = 'P'
- 如果只有第2个条件满足,则return记录
CUST_FLAG = 'J'
- 如果两个条件都满足,则return只记录
CUST_FLAG = 'P'
.
尝试玩转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
这是一个优先查询。要在单个 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;
您可以通过对记录进行排序并只取第一个来实现此目的。 (但请注意,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?
WHERE (ADDR1 = '1500 Valley Rd' AND CUST_FLAG = 'P') -- 1
OR (ADDR1 = '1500 Valley Rd' AND CUST_FLAG = 'J') -- 2
请帮我解决这个问题。我只需要显示 CUST_FLAG = 'P'
的记录。使用上面的 Where 子句,如果两个条件都满足,我将获得两个记录。
我的要求是:
- 如果只有第一个条件满足,则return记录
CUST_FLAG = 'P'
- 如果只有第2个条件满足,则return记录
CUST_FLAG = 'J'
- 如果两个条件都满足,则return只记录
CUST_FLAG = 'P'
.
尝试玩转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
这是一个优先查询。要在单个 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;
您可以通过对记录进行排序并只取第一个来实现此目的。 (但请注意,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?