2017-04-06 49 views
0

我一直在尝试以下查询,目标是从A中获取结果,然后使用来自A(客户编号和部分)的特定信息在前几年中获取信息基于部分。使用第一个查询中的特定结果来查询以获取更多数据

我一直在尝试不同的变化,但不能得到这个工作。

想法?

Select * from Table A 
where CODE = 'YYY' and Year (END_DATE)> '2015' OR 
Part like 'Z%' AND plan like '5%' and Year (END_DATE)> '2015' 
)AS A 

WHERE (EXISTS 
     (SELECT * from (Select * from Table B) as B 

WHERE B.Part = A.PArt 
      AND B.CUST_NUM = A.CUST_NUM 
      AND YEAR(B.Start_date) = YEAR(A.Start_Date) - 1) 
+0

DB2是否支持'WITH'(又名CTE)? – jarlh

+0

我相信你的想法是什么? –

+0

为什么你要使查询如此复杂? – Rams

回答

0

你可以做下面的事情。

Select * from Table A 
where (CODE = 'YYY' and Year (END_DATE)> '2015') OR 
(Part like 'Z%' AND plan like '5%' and Year (END_DATE)> '2015') 
WHERE EXISTS 
     (SELECT * from table B WHERE B.Part = A.PArt 
      AND B.CUST_NUM = A.CUST_NUM 
      AND YEAR(B.Start_date)=YEAR(A.Start_Date) - 1) 

而把条件paranthesis如果有和或两者都存在

0
--You can simplify your query like it : 
-- 1) year function return always number then dont compare with char 
-- 2) END_DATE>2015 are into 2 parts of your OR condition then you can factor it 
-- 3) for better lisibility you can compare key in same line like it (X1, Y1)=(X2, Y2) 

Select * from Table A 
where END_DATE>2015 and (CODE = 'YYY' OR Part like 'Z%' AND plan like '5%') 
AND EXISTS 
(
    SELECT * from table B 
    WHERE 
    (A.CUST_NUM, A.PArt, YEAR(A.Start_Date) - 1)=(B.CUST_NUM, B.Part, YEAR(B.Start_date)) 
) 


--Other solution with join simple 
Select distinct A.* from Table A 
inner join Table B on (A.CUST_NUM, A.PArt, YEAR(A.Start_Date) - 1)=(B.CUST_NUM, B.Part, YEAR(B.Start_date)) 
where 
A.END_DATE>2015 and (A.CODE = 'YYY' OR A.Part like 'Z%' AND A.plan like '5%') 
相关问题