2017-01-24 4 views
0

QUERY 1Spalten auswählen, basierend auf der aktuellen Spalte ausgewählt (SQL)

WITH CUST1 AS 
(SELECT CUSTOMER_ID, TYPE FROM CUSTOMERS WHERE CONDITION), 
    CARS1 AS 
(SELECT * FROM CARS INNER JOIN CUST1 ON 
    CUST1.CUSTOMER_ID = CARS.CUSTOMER_ID AND 
    CUST1.TYPE = CARS.TYPE) select * from CARS1; 

CUSTOMERE TABLE

CUSTOMER_ID || TYPE   
    ------------|| -------  
    1   ||  5   
    2   ||  5   
    3   ||  2   
    4   ||  2     

CARS TABLE

CAR_ID || CUSTOMER_ID || TYPE || SN || DATE          
------- || ------------ || ------ || ----- || ------- 
1  || 1   || 5  |||| 02/06/1999 
2  || 1   || 2  || 2365 || 03/08/1999    
3  || 1   || 3  || 5156 || 03/02/1999  
4  || 3   || 1  || 8651 || 03/03/1999  
5  || 2   || 5  || 2555 || 03/09/1999  
6  || 2   || 2  || 8562 || 03/18/1999 

QUERY 1 Ergebnis

CAR_ID || CUSTOMER_ID || TYPE || SN || DATE  
------- || ------------ || ------ || ----- || -------- 
1  || 1   ||  5 |||| 02/06/1999 
5  || 2   ||  5 || 2555 || 03/09/1999 

Die obige Abfrage tritt in die temporäre Tabelle "CUST1" mit einem tatsächlichen Tabelle "CARS" auf den Säulen CUSTOMER_ID und TYPE. Nun, was ich zu erreichen hoffe, ist die DATE AS DATE2 und SN AS SN2 von CARS, die zu dem Kunden gehören, wo die CARS.TYPE = 2 für CUSTOMER_IDs aus der JOIN-Bedingung ergab.

Das Dilemma ist jedoch, dass ich nicht wieder eine Unterabfrage mitmachen/verwenden möchte, da die CARS-Tabelle sehr groß ist. Bitte ignorieren Sie den Ansatz der temporären Tabelle, da er aus anderen Gründen im Rest des Codes verwendet wird. Die aktuelle Spalte wäre CUSTOMER_ID und die anderen beiden Spalten, die auf dieser CUSTOMER_ID basieren, sind SN und TYPE.

Erwartete Ergebnisse

CAR_ID || CUSTOMER_ID || TYPE || SN || DATE  || DATE2  || SN2 
------- || ------------ || ------ || ----- || -------- || -------  || ----- 
1  ||  1   ||  5 |||| 02/06/1999 || 03/08/1999 || 2365 
5  ||  2   ||  5 || 2555 || 03/09/1999 || 03/18/1999 || 8562 
+0

Sind Sie sicher, 'Query 1'? Die Syntax ist falsch. –

+0

Ja, betrachten Sie CUST1 als treibende Tabelle und CARS1 als Abfrage, die basierend auf den Ergebnissen der ersten Abfrage auswählt. –

+0

Also wollen Sie grundsätzlich Daten aus zwei verschiedenen Zeilen in CARS für jede Zeile in KUNDEN, aber ohne CARS mehr als einmal zu verbinden? Das könnte ein Problem sein ... – Jerrad

Antwort

0

Ich bin nicht sicher, können Sie ohne beitreten zurück zu den Autos. Wie groß ist dein Autotisch? Mit meinem einfachen Test stellte ich fest, dass ich einen Bloom-Filter erstellte, der effizient genug sein könnte, um die Abfrage durchzuführen. Warum versuchst du es nicht, um zu sehen, ob du wirklich ein Problem hast? Vielleicht den Ausführungsplan posten. Zum Beispiel:

select c.car_id, c.customer_id, c.type, c.sn, c.car_date, c2.sn, c2.car_date, c2.sn 
from cars c 
join cust cu 
on c.customer_id = cu.customer_id 
and c.type = cu.type 
join cars c2 
on c2.customer_id = cu.customer_id 
where c2.type = 2 

gibt

CAR_ID CUSTOMER_ID  TYPE SN CAR_DATE SN CAR_DATE SN 
---------- ----------- ---------- ---- --------- ---- --------- ---- 
     1   1   5-FEB-99 2365 08-MAR-99 2365 
     5   2   5 2555 09-MAR-99 8652 18-MAR-99 8652 

.

select * from table(dbms_xplan.display_cursor(null, null, 'TYPICAL')); 

---------------------------------------------------------------- 
| Id | Operation     | Name | Rows | Bytes | 
---------------------------------------------------------------- 
| 0 | SELECT STATEMENT    |   |  |  | 
|* 1 | HASH JOIN     |   |  2 | 234 | 
| 2 | JOIN FILTER CREATE   | :BF0000 |  2 | 130 | 
|* 3 | HASH JOIN     |   |  2 | 130 | 
|* 4 |  TABLE ACCESS STORAGE FULL| CARS |  2 | 78 | 
| 5 |  TABLE ACCESS STORAGE FULL| CUST |  4 | 104 | 
| 6 | JOIN FILTER USE   | :BF0000 |  6 | 312 | 
|* 7 | TABLE ACCESS STORAGE FULL | CARS |  6 | 312 | 
---------------------------------------------------------------- 
0

denke ich bedingte Aggregation wird tun, was Sie wollen. Ich bin mir nicht sicher, was die eigentlich logisch ist, aber es scheint in diese Richtung zu sein:

SELECT CAR_ID, CUSTOMER_ID, 5 as TYPE, 
     MAX(CASE WHEN TYPE = 5 THEN SN END) as SN, 
     MAX(CASE WHEN TYPE = 5 THEN DATE END) as DATE, 
     MAX(CASE WHEN TYPE = 2 THEN SN END) as SN2, 
     MAX(CASE WHEN TYPE = 2 THEN DATE END) as DATE2, 
CARS c INNER JOIN CUST1 cu 
    ON cu.CUSTOMER_ID = c.CUSTOMER_ID AND 
     cu.TYPE = c.TYPE 
WHERE CONDITION 
GROUP BY CAR_ID, CUSTOMER_ID; 
+0

Es scheint ziemlich klar aus der Frage, seinem Titel und den geposteten Probendaten, dass die Typen "5" und "2" aus der "Kunden" -Tabelle gelesen werden müssen - sie sind keine festen Zahlen. – mathguy

Verwandte Themen