2017-01-24 72 views
0

QUERY 1基于当前列上选择列(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个结果

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

上述查询连接临时表“CUST1”与列上CUSTOMER_IDTYPE实际的表“车”。 现在,我希望实现的是从属于客户的CARS中选择DATE AS DATE2和SN AS SN2,其中对于由JOIN条件产生的CUSTOMER_ID的CARS.TYPE = 2,其中 。

但是,由于CARS表非常大,我不想重新加入/使用子查询。 由于其他原因,请在代码的其余部分中使用,请忽略临时表方法。 当前列将是CUSTOMER_ID,而基于该CUSTOMER_ID的另外两列将是SN和TYPE。

预期结果

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

你确定'查询1'吗?语法不正确。 –

+0

是的,将CUST1作为驱动表并将CARS1作为基于第一个查询的reults进行选择的查询。 –

+0

因此,您基本上需要CARS中两行不同行的数据,但客户中的每一行都不需要多次加入CARS?这可能是一个问题... – Jerrad

回答

0

我不知道你可以没有联系回车。你的汽车桌有多大?使用我的简单测试,我发现我正在创建一个bloom过滤器,这可能足以使查询有效。为什么不试试看看你是否真的有问题?也许发布执行计划。例如:

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 

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

我认为有条件的聚集会做你想要什么。我不确定实际的逻辑是什么,但它似乎是沿着这些线:

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

从问题,标题和发布的样本数据中可以看出,类型“5”和“2”需要从“客户”表中读取 - 它们不是固定数字。 – mathguy