2016-06-13 8 views
0

Ich habe zwei Abfragen.Oracle SQL - Verwenden der Ergebnisse von zwei Abfragen als die WHERE-Bedingung in einem anderen

Abfrage 1:

SELECT g.ccc, g.nnn, g.ttt, g.aaa 
FROM table1 g 
WHERE g.aaa BETWEEN '3000' AND '3999' 
AND g.ccc NOT IN('05','06') 
AND g.nnn = '1369' 

Abfrage 2:

SELECT g.ccc, g.nnn, g.ttt, g.aaa 
FROM table1 g 
WHERE g.aaa BETWEEN '1544' AND '1567' 
AND g.ccc NOT IN('05','06') 
AND g.nnn = '1369' 

Abfrage 1 Output:

ccc nnn  ttt aaa 
07 1369 F 3400 
07 1369 F 3402 
19 1369 F 3601 
19 1369 F 3600 
20 1369 F 3500 
20 1369 F 3500 
20 1369 F 3500 
20 1369 F 3500 
20 1369 F 3500 
20 1369 F 3500 
20 1369 F 3500 
20 1369 F 3500 
20 1369 F 3500 
20 1369 F 3500 
20 1369 F 3500 

Abfrage 2 Output:

ccc nnn  ttt aaa 
19 1369 F 1564 

Ich möchte die Ergebnisse dieser beiden Tabellen verwenden, um eine Ausgabe zu erhalten, bei der, wenn ein ccc Ergebnisse in beiden Abfragen hat, alle zurückgegebenen Daten aus beiden Abfragen ausgegeben werden, wenn ein ccc nur eine Abfrage ergibt, oder in keinem, dann wird keines seiner Ergebnisse ausgegeben.

Erwartete Ausgabe:

ccc nnn  ttt aaa 
19 1369 F 3601 
19 1369 F 3600 
19 1369 F 1564 
+0

Matt, was der Unterschied zwischen diesem und Ihrer vorherigen Frage ist http://stackoverflow.com/questions/37789356/oracle-sql-multiplewhere-conditions-based-on-each-other-from-the-same- Tabelle – Mottor

Antwort

1

Ich kam auf diese scheinen kompliziert, vielleicht ein bisschen optimiert sein

SELECT g.ccc, g.nnn, g.ttt, g.aaa 
    FROM table1 g, 
(
SELECT distinct g.ccc 
FROM table1 g 
WHERE (g.aaa BETWEEN '1544' AND '1567' 
     or g.aaa BETWEEN '3000' AND '3999') 
AND g.ccc NOT IN('05','06') 
AND g.nnn = '1369' 
) t.ccc 
WHERE g.aaa BETWEEN '1544' AND '1567' 
AND g.ccc=t.ccc 
AND g.nnn = '1369' 
union 
SELECT g.ccc, g.nnn, g.ttt, g.aaa 
FROM table1 g, 
(
SELECT distinct g.ccc 
FROM table1 g 
WHERE (g.aaa BETWEEN '1544' AND '1567' 
     or g.aaa BETWEEN '3000' AND '3999') 
AND g.ccc NOT IN('05','06') 
AND g.nnn = '1369' 
) t.ccc 
WHERE g.aaa BETWEEN '3000' AND '3999' 
AND g.ccc=t.ccc 
AND g.nnn = '1369' 
+0

nicht genau das, was ich will, aber es hat mir erlaubt, meine Antwort zu entwickeln! – Matt

1

Versuchen:

WITH query1 AS (
    SELECT g.ccc, g.nnn, g.ttt, g.aaa 
    FROM table1 g 
    WHERE g.aaa BETWEEN '3000' AND '3999' 
    AND g.ccc NOT IN('05','06') 
    AND g.nnn = '1369' 
), 
query2 AS (
    SELECT g.ccc, g.nnn, g.ttt, g.aaa 
    FROM table1 g 
    WHERE g.aaa BETWEEN '1544' AND '1567' 
    AND g.ccc NOT IN('05','06') 
    AND g.nnn = '1369' 
) 
SELECT * FROM query1 
WHERE ccc IN (SELECT ccc FROM query2) 
UNION ALL 
SELECT * FROM query2 
WHERE ccc IN (SELECT ccc FROM query1) 
1

Wir haben die analytischen Funktionen verwenden können, MAX() OVER(), mit Partition von ccc

SELECT * 
    FROM (SELECT x.*, 
       MAX (CASE WHEN (g.aaa BETWEEN '3000' AND '3999' AND g.ccc NOT IN ('05', '06') AND g.nnn = '1369') THEN 1 ELSE 0 END) OVER (PARTITION BY ccc) c1, 
       MAX (CASE WHEN (g.aaa BETWEEN '1544' AND '1567' AND g.ccc NOT IN ('05', '06') AND g.nnn = '1369') THEN 1 ELSE 0 END) OVER (PARTITION BY ccc) c2 
      FROM table1 g) 
WHERE c1 = 1 AND c2 = 1 
Verwandte Themen