2016-07-29 9 views
1
WHERE (ADDR1 = '1500 Valley Rd' AND CUST_FLAG = 'P')  -- 1 
    OR (ADDR1 = '1500 Valley Rd' AND CUST_FLAG = 'J')  -- 2 

この質問を参考にしてください。私はCUST_FLAG = 'P'と記録だけを示す必要があります。上記のWhere節では、両方の条件が満たされていれば、両方のレコードを取得しています。 私の要件は次のとおりです。2つの条件で1つのレコードのみを返すSQLクエリ

  1. のみ第一の条件を満たした場合は、条件の両方を満たす場合にのみ返され、その後、CUST_FLAG = 'J'
  2. でレコードを返し、その後、唯一の第二の条件を満たした場合CUST_FLAG = 'P'
  3. を持つレコードを返しますCUST_FLAG = 'P'のレコード。
+0

どのような "第二の条件"?そこには4つの異なる比較があります。 –

+0

私はORの前と後のステートメントを意味しました。 ADDR1 = '1500 Valley Rd' AND CUST_FLAG = 'P'は1 ADDR1 = '1500 Valley Rd' AND CUST_FLAG = 'J'は2 – KG47

答えて

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; 
+2

ORDER BY条件をPの事故に少し依存しないようにするには、 J: ''P'、 'J'、そして、1 '終了時にcase cust_flag順に - 少なくともそれは意図が何であるかを明確にします。 – mathguy

0

これは、優先順位付けクエリで周り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 
0

あなたは、レコードをソートし、最初を取ることによって、これを達成することができます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 

をオラクル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?

関連する問題