我有一个包含循环代码列表的表.CYCLE_DEFINITION。 每个cycle_code在另一个表(PM1_CYCLE_STATE)中有12个月的条目。 每个月都有一个cycle_start_date和一个cycle_close_date。 我将检查一个特定的日期(比如说sysdate)并检查每个周期的当前月份。我还将获得该特定周期未来3个月的列表。
我写的查询如下:
SELECT cycd,cm,sd,ed,ld FROM (SELECT pcs.cycle_code CYCD,LTRIM(pcs.cycle_month,'0')+0 CM, pcs.cycle_start_date SD,pcs.cycle_close_date ED,ld.logical_date LD FROM pm1_cycle_state pcs,logical_date ld WHERE
ld.logical_date BETWEEN pcs.cycle_start_date AND pcs.cycle_close_date and ld.logical_date_type='B')
UNION
SELECT cycd,cm,sd,ed,ld FROM (SELECT pcs.cycle_code CYCD,DECODE(LTRIM(pcs.cycle_month,'0')+1,13,1,14,2,15,3,LTRIM(pcs.cycle_month,'0')+1) CM ,pcs.cycle_start_date SD,pcs.cycle_close_date ED,ld.logical_date LD FROM pm1_cycle_state pcs,logical_date ld WHERE
ld.logical_date BETWEEN pcs.cycle_start_date AND pcs.cycle_close_date and ld.logical_date_type='B')
UNION
SELECT cycd,cm,sd,ed,ld FROM (SELECT pcs.cycle_code CYCD,DECODE(LTRIM(pcs.cycle_month,'0')+2,13,1,14,2,15,3,LTRIM(pcs.cycle_month,'0')+2) CM ,pcs.cycle_start_date SD,pcs.cycle_close_date ED,ld.logical_date LD FROM pm1_cycle_state pcs,logical_date ld WHERE
ld.logical_date BETWEEN pcs.cycle_start_date AND pcs.cycle_close_date and ld.logical_date_type='B')
UNION
SELECT cycd,cm,sd,ed,ld FROM (SELECT pcs.cycle_code CYCD,DECODE(LTRIM(pcs.cycle_month,'0')+3,13,1,14,2,15,3,LTRIM(pcs.cycle_month,'0')+3) CM ,pcs.cycle_start_date SD,pcs.cycle_close_date ED,ld.logical_date LD FROM pm1_cycle_state pcs,logical_date ld WHERE
ld.logical_date BETWEEN pcs.cycle_start_date AND pcs.cycle_close_date and ld.logical_date_type='B')
此查询运行正常。 这将导致所有cycle_codes当前月份和未来3个月恰好有4行。
现在的要求是,如果缺少任何一个月,我可以展示吗? 例如:上述查询的输出是
cycd cm
102 1
102 10
102 11
102 12
103 1
103 10
103 11
103 12
104 1
104 10
104 11
104 12
现在假设表中没有cycd = 104和cm = 11的行,那么上面的查询将不会获得行104 11
。
我想只显示那些行。
我怎么能这样做?
答案 0 :(得分:0)
创建一个包含月份1到12的表,使用pm1_cycle_state交叉连接月份,并使用select语句左键连接(可能作为视图):
SELECT pm1_cycle_state.cycle_code, months.month
FROM pm1_cycle_state
CROSS JOIN months
LEFT OUTER JOIN V_Cycle_Months
ON V_Cycle_Months.cycd = pm1_cycle_state.cycle_code
AND V_Cycle_Months.cm = months.month
WHERE V_Cycle_Months.cycd IS NULL
答案 1 :(得分:0)
我通过大量思考得到了另一种更好的方法。 如果我有这样的清单:
102 1
102 10
102 11
102 12
103 1
103 10
103 11
103 12
然后我也可以得到如下表格中的现有条目列表(假设表格中没有103 11)。现在我的查询输出如下
102 1
102 10
102 11
102 12
103 1
103 10
103 12
因为我有上面的两个列表,我可以简单地做两个查询的减号,并根据我问的问题得到所需的输出。我做了同样的事情。我得到了预期的输出。请给我一些评论你想看看这个问题!