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

Bitte helfen Sie mir bei dieser Abfrage. Ich muss nur den Datensatz mit CUST_FLAG = 'P' zeigen. Mit der obigen Where-Klausel erhalte ich beide Datensätze, wenn beide Bedingungen erfüllt sind. Meine Forderung ist:SQL-Abfrage zum Zurückgeben von nur 1 Datensatz mit 2 erfüllten Bedingungen

  1. Wenn nur erste Bedingung erfüllt, dann den Datensatz Rückkehr mit CUST_FLAG = 'P'
  2. Wenn nur zweite Bedingung erfüllt, dann den Datensatz Rückkehr mit CUST_FLAG = 'J'
  3. beiden Wenn die Bedingungen erfüllt, dann nur zurückkehren der Datensatz mit CUST_FLAG = 'P'. Dies ist eine Priorisierung Abfrage
+0

was "2. Bedingung"? Du hast dort 4 verschiedene Vergleiche. –

+0

Ich meinte die Aussagen vor und nach OR. ADDR1 = '1500 Valley Rd' UND CUST_FLAG = 'P' ist 1 ADDR1 = '1500 Valley Rd' UND CUST_FLAG = 'J' ist 2 – KG47

Antwort

1

zu spielen. Um dies zu tun in einer einzigen where Klausel, können Sie tun:

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' 
     )) 

Oder eine typische Art und Weise verwenden 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

Oder, um die ORDER BY-Bedingung etwas weniger abhängig von dem Unfall von P und J: 'cust_flag in Groß-/Kleinschreibung, wenn 'P', dann 0, wenn 'J' und dann '1' - das macht zumindest klar, was die Absicht war. – mathguy

0

rumprobieren 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

Sie können dies erreichen, indem die Datensätze sortieren und nehmen nur die erste ein. (Beachten Sie jedoch, dass ROWNUM Macht von Oracle-spezifischen Syntax.)

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 

Da Oracle 12c, die folgende Syntax ist ebenfalls möglich:

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; 

Siehe auch: - On ROWNUM and Limiting Results - How do I limit the number of rows returned by an Oracle query after ordering?