Senz79
asked on
THE RECURSIVE COMMON TABLE EXPRESSION name MAY CONTAIN AN INFINITE LOOP
Hello All
Kindly hep me with the below error
THE RECURSIVE COMMON TABLE EXPRESSION name MAY CONTAIN AN INFINITE LOOP
Thanks Senz
Kindly hep me with the below error
THE RECURSIVE COMMON TABLE EXPRESSION name MAY CONTAIN AN INFINITE LOOP
Thanks Senz
We will need to see the code which is causing this error. Apparently it looks like a circular reference
This would be a warning rather than a error...
Kindly post your CTE to confirm..
Kindly post your CTE to confirm..
This would be a warning rather than a error...
Kindly post your CTE to confirm..
Kindly post your CTE to confirm..
when you have a table expression that use recursive sql, you may go into an infinite loop
in order to avoid that, you should code some extra predicate
look at the example here:
WITH NUMBERS (LEVEL, NEXTONE) AS
(
SELECT 1, 1
FROM SYSIBM.SYSDUMMY1
UNION ALL
SELECT LEVEL +1, LEVEL +1
FROM NUMBERS
WHERE LEVEL < 100
)
SELECT NEXTONE
FROM NUMBERS
ORDER BY NEXTONE
the level column and predicate is used to limit the level of nesting
in order to avoid that, you should code some extra predicate
look at the example here:
WITH NUMBERS (LEVEL, NEXTONE) AS
(
SELECT 1, 1
FROM SYSIBM.SYSDUMMY1
UNION ALL
SELECT LEVEL +1, LEVEL +1
FROM NUMBERS
WHERE LEVEL < 100
)
SELECT NEXTONE
FROM NUMBERS
ORDER BY NEXTONE
the level column and predicate is used to limit the level of nesting
ASKER
hi below is the query
SELECT DISTINCT
TASK_TARGET_VIEW.SERVER_ID, TASK_TARGET_VIEW.SERVER_NAME, TASK_TARGET_VIEW.OS_NAME,
TASK_TARGET_VIEW.OS_VERSION, TASK_TARGET_VIEW.POOL, TASK_TARGET_VIEW.TIER,
TASK_TARGET_VIEW.CUSTOMER_NAME, TASK_TARGET_VIEW.APPLICATION_NAME,
TASK_TARGET_VIEW.STATE, TASK_TARGET_VIEW.CUSTOMER_ID, TASK_TARGET_VIEW.APPLICATION_ID,
TASK_TARGET_VIEW.POOL_ID, TASK_TARGET_VIEW.TIER_ID, TASK_STATUS_VIEW.TASK_ID,
TASK_STATUS_VIEW.CREATED_BY_USER, TASK_STATUS_VIEW.TIMEOUT, TASK_STATUS_VIEW.TASK_JOB_NAME,
ASK_STATUS_VIEW.TASK_JOB_TYPE, TASK_STATUS_VIEW.DESCRIPTION TASK_DESRIPTION, TASK_TARGET_VIEW.TARGET_STATUS,
TASK_TARGET_VIEW.REQUEST_ID, TASK_STATUS_VIEW.START_DATE, TASK_STATUS_VIEW.END_DATE,
TASK_STATUS_VIEW.MAIN_TASK_STATUS,
UNCLIPPED_SOFTWARE_INFO_VIEW.MODULE_ID, UNCLIPPED_SOFTWARE_INFO_VIEW.SOFTWARE,
UNCLIPPED_SOFTWARE_INFO_VIEW.VENDOR, UNCLIPPED_SOFTWARE_INFO_VIEW.VERSION,
UNCLIPPED_SOFTWARE_INFO_VIEW.DESCRIPTION SOFTWARE_DESCRIPTION,
UNCLIPPED_SOFTWARE_INFO_VIEW."TYPE" SOFTWARE_TYPE,
TASK_TARGET_VIEW.GROUP_ID, TASK_TARGET_VIEW.GROUP_NAME
FROM
TASK_STATUS_VIEW
INNER JOIN TASK_JOB_ITEM ON (TASK_STATUS_VIEW.TASK_JOB_ID=TASK_JOB_ITEM.TASK_JOB_ID)
INNER JOIN TASK_ARGUMENT ON ( (TASK_ARGUMENT."NAME" = 'SoftwareModuleID' OR TASK_ARGUMENT."NAME" = 'ImageID')
AND TASK_ARGUMENT.JOB_ITEM_ID=TASK_JOB_ITEM.TASK_JOB_ITEM_ID AND TASK_JOB_ITEM.WORKFLOW_NAME NOT LIKE '%Capture%')
INNER JOIN TASK_TARGET_VIEW ON (TASK_TARGET_VIEW.TASK_ID=TASK_STATUS_VIEW.TASK_ID)
INNER JOIN PATCH_IN_STACK_IN_STACK_VIEW ON (CHAR(PATCH_IN_STACK_IN_STACK_VIEW.STACK_ID) = TASK_ARGUMENT."VALUE")
INNER JOIN UNCLIPPED_SOFTWARE_INFO_VIEW ON UNCLIPPED_SOFTWARE_INFO_VIEW.MODULE_ID =
PATCH_IN_STACK_IN_STACK_VIEW .MODULE_ID
well,
the recursive expression is probably inside one of the views you select from, so you will need to find which one
the recursive expression is probably inside one of the views you select from, so you will need to find which one
Your Query looks normal without Common Table Expressions and no chances of looping in the query above..
Kindly provide the query using WITH Clause..
Kindly provide the query using WITH Clause..
ASKER
WITH RPL (STACK_ID, MODULE_ID) AS ( SELECT ROOT.STACK_ID, ROOT.MODULE_ID FROM software_stack_entry ROOT WHERE ROOT.MODULE_ID in (select software_patch_id from software_patch) UNION ALL SELECT CHILD.STACK_ID, PARENT.MODULE_ID FROM RPL PARENT, software_stack_entry CHILD WHERE PARENT.STACK_ID = CHILD.MODULE_ID ) SELECT DISTINCT STACK_ID, module_id FROM RPL
try
WITH RPL (STACK_ID, MODULE_ID,LEVEL) AS ( SELECT ROOT.STACK_ID, ROOT.MODULE_ID,1 LEVEL FROM software_stack_entry ROOT WHERE ROOT.MODULE_ID in (select software_patch_id from software_patch) UNION ALL SELECT CHILD.STACK_ID, PARENT.MODULE_ID, LEVEL+1 FROM RPL PARENT, software_stack_entry CHILD WHERE PARENT.STACK_ID = CHILD.MODULE_ID AND LEVEL < 100) SELECT DISTINCT STACK_ID, module_id FROM RPL
WITH RPL (STACK_ID, MODULE_ID,LEVEL) AS ( SELECT ROOT.STACK_ID, ROOT.MODULE_ID,1 LEVEL FROM software_stack_entry ROOT WHERE ROOT.MODULE_ID in (select software_patch_id from software_patch) UNION ALL SELECT CHILD.STACK_ID, PARENT.MODULE_ID, LEVEL+1 FROM RPL PARENT, software_stack_entry CHILD WHERE PARENT.STACK_ID = CHILD.MODULE_ID AND LEVEL < 100) SELECT DISTINCT STACK_ID, module_id FROM RPL
ASKER
Hi Momi
the above syntax works fine but how di i include it in the parent query
SELECT DISTINCT TASK_TARGET_VIEW.SERVER_ID , TASK_TARGET_VIEW.SERVER_NA ME, TASK_TARGET_VIEW.OS_NAME, TASK_TARGET_VIEW.OS_VERSIO N, TASK_TARGET_VIEW.POOL, TASK_TARGET_VIEW.TIER, TASK_TARGET_VIEW.CUSTOMER_ NAME, TASK_TARGET_VIEW.APPLICATI ON_NAME, TASK_TARGET_VIEW.STATE, TASK_TARGET_VIEW.CUSTOMER_ ID, TASK_TARGET_VIEW.APPLICATI ON_ID, TASK_TARGET_VIEW.POOL_ID, TASK_TARGET_VIEW.TIER_ID, TASK_STATUS_VIEW.TASK_ID, TASK_STATUS_VIEW.CREATED_B Y_USER, TASK_STATUS_VIEW.TIMEOUT, TASK_STATUS_VIEW.TASK_JOB_ NAME, ASK_STATUS_VIEW.TASK_JOB_T YPE, TASK_STATUS_VIEW.DESCRIPTI ON TASK_DESRIPTION, TASK_TARGET_VIEW.TARGET_ST ATUS, TASK_TARGET_VIEW.REQUEST_I D, TASK_STATUS_VIEW.START_DAT E, TASK_STATUS_VIEW.END_DATE, TASK_STATUS_VIEW.MAIN_TASK _STATUS, UNCLIPPED_SOFTWARE_INFO_VI EW.MODULE_ ID, UNCLIPPED_SOFTWARE_INFO_VI EW.SOFTWAR E, UNCLIPPED_SOFTWARE_INFO_VI EW.VENDOR, UNCLIPPED_SOFTWARE_INFO_VI EW.VERSION , UNCLIPPED_SOFTWARE_INFO_VI EW.DESCRIP TION SOFTWARE_DESCRIPTION, UNCLIPPED_SOFTWARE_INFO_VI EW."TYPE" SOFTWARE_TYPE, TASK_TARGET_VIEW.GROUP_ID, TASK_TARGET_VIEW.GROUP_NAM E FROM TASK_STATUS_VIEW INNER JOIN TASK_JOB_ITEM ON (TASK_STATUS_VIEW.TASK_JOB _ID=TASK_J OB_ITEM.TA SK_JOB_ID) INNER JOIN TASK_ARGUMENT ON ( (TASK_ARGUMENT."NAME" = 'SoftwareModuleID' OR TASK_ARGUMENT."NAME" = 'ImageID') AND TASK_ARGUMENT.JOB_ITEM_ID= TASK_JOB_I TEM.TASK_J OB_ITEM_ID AND TASK_JOB_ITEM.WORKFLOW_NAM E NOT LIKE '%Capture%') INNER JOIN TASK_TARGET_VIEW ON (TASK_TARGET_VIEW.TASK_ID= TASK_STATU S_VIEW.TAS K_ID) INNER JOIN PATCH_IN_STACK_IN_STACK_VI EW ON (CHAR(PATCH_IN_STACK_IN_ST ACK_VIEW.S TACK_ID) = TASK_ARGUMENT."VALUE") INNER JOIN UNCLIPPED_SOFTWARE_INFO_VI EW ON UNCLIPPED_SOFTWARE_INFO_VI EW.MODULE_ ID = PATCH_IN_STACK_IN_STACK_VI EW .MODULE_ID Open in New Window Select All Accept and Award Points Accept as Solution
Where the line
INNER JOIN PATCH_IN_STACK_IN_STACK_VI EW
has the recurrsion
the above syntax works fine but how di i include it in the parent query
SELECT DISTINCT TASK_TARGET_VIEW.SERVER_ID
Where the line
INNER JOIN PATCH_IN_STACK_IN_STACK_VI
has the recurrsion
you have to options,
either correct the definition of the view, or instead of writing
INNER JOIN PATCH_IN_STACK_IN_STACK_VI EW
write
inner join (SELECT DISTINCT STACK_ID, module_id FROM RPL) PATCH_IN_STACK_IN_STACK_VI EW
either correct the definition of the view, or instead of writing
INNER JOIN PATCH_IN_STACK_IN_STACK_VI
write
inner join (SELECT DISTINCT STACK_ID, module_id FROM RPL) PATCH_IN_STACK_IN_STACK_VI
ASKER
will it be something like below
SELECT DISTINCT TASK_TARGET_VIEW.SERVER_ID, TASK_TARGET_VIEW.SERVER_NAME,
TASK_TARGET_VIEW.OS_NAME, TASK_TARGET_VIEW.OS_VERSION, TASK_TARGET_VIEW.POOL,
TASK_TARGET_VIEW.TIER, TASK_TARGET_VIEW.CUSTOMER_NAME,
TASK_TARGET_VIEW.APPLICATION_NAME, TASK_TARGET_VIEW.STATE, TASK_TARGET_VIEW.CUSTOMER_ID,
TASK_TARGET_VIEW.APPLICATION_ID, TASK_TARGET_VIEW.POOL_ID,
TASK_TARGET_VIEW.TIER_ID, TASK_STATUS_VIEW.TASK_ID, TASK_STATUS_VIEW.CREATED_BY_USER,
TASK_STATUS_VIEW.TIMEOUT, TASK_STATUS_VIEW.TASK_JOB_NAME, TASK_STATUS_VIEW.TASK_JOB_TYPE,
TASK_STATUS_VIEW.DESCRIPTION TASK_DESRIPTION, TASK_TARGET_VIEW.TARGET_STATUS,
TASK_TARGET_VIEW.REQUEST_ID, TASK_STATUS_VIEW.START_DATE, TASK_STATUS_VIEW.END_DATE,
TASK_STATUS_VIEW.MAIN_TASK_STATUS,
--UNCLIPPED_SOFTWARE_INFO_VIEW.MODULE_ID, UNCLIPPED_SOFTWARE_INFO_VIEW.SOFTWARE, UNCLIPPED_SOFTWARE_INFO_VIEW.VENDOR, UNCLIPPED_SOFTWARE_INFO_VIEW.VERSION, UNCLIPPED_SOFTWARE_INFO_VIEW.DESCRIPTION SOFTWARE_DESCRIPTION, UNCLIPPED_SOFTWARE_INFO_VIEW."TYPE" SOFTWARE_TYPE,
TASK_TARGET_VIEW.GROUP_ID, TASK_TARGET_VIEW.GROUP_NAME FROM TASK_STATUS_VIEW
INNER JOIN TASK_JOB_ITEM ON (TASK_STATUS_VIEW.TASK_JOB_ID=TASK_JOB_ITEM.TASK_JOB_ID)
INNER JOIN TASK_ARGUMENT ON ( (TASK_ARGUMENT."NAME" = 'SoftwareModuleID' OR TASK_ARGUMENT."NAME" = 'ImageID')
AND TASK_ARGUMENT.JOB_ITEM_ID=TASK_JOB_ITEM.TASK_JOB_ITEM_ID AND
TASK_JOB_ITEM.WORKFLOW_NAME NOT LIKE '%Capture%')
INNER JOIN TASK_TARGET_VIEW ON (TASK_TARGET_VIEW.TASK_ID=TASK_STATUS_VIEW.TASK_ID)
INNER JOIN
(WITH RPL (STACK_ID, MODULE_ID,LEVEL) AS
( SELECT ROOT.STACK_ID, ROOT.MODULE_ID,1 LEVEL FROM software_stack_entry ROOT WHERE ROOT.MODULE_ID in
(select software_patch_id from software_patch) UNION ALL SELECT CHILD.STACK_ID, PARENT.MODULE_ID, LEVEL+1
FROM RPL PARENT, software_stack_entry CHILD WHERE PARENT.STACK_ID = CHILD.MODULE_ID AND LEVEL < 100)
SELECT DISTINCT STACK_ID, module_id FROM RPL)
PATCH_IN_STACK_IN_STACK_VIEW ON (CHAR(PATCH_IN_STACK_IN_STACK_VIEW.STACK_ID) = TASK_ARGUMENT."VALUE")
INNER JOIN UNCLIPPED_SOFTWARE_INFO_VIEW ON UNCLIPPED_SOFTWARE_INFO_VIEW.MODULE_ID =
PATCH_IN_STACK_IN_STACK_VIEW .MODULE_ID
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Hi Momi
This should return data but the query is giving 0 results
This should return data but the query is giving 0 results
are you sure the problem is with part i gave you? do you get any results when running
WITH RPL (STACK_ID, MODULE_ID,LEVEL) AS
( SELECT ROOT.STACK_ID, ROOT.MODULE_ID,1 LEVEL FROM software_stack_entry ROOT WHERE ROOT.MODULE_ID in
(select software_patch_id from software_patch) UNION ALL SELECT CHILD.STACK_ID, PARENT.MODULE_ID, LEVEL+1
FROM RPL PARENT, software_stack_entry CHILD WHERE PARENT.STACK_ID = CHILD.MODULE_ID AND LEVEL < 100)
select * from rpl
WITH RPL (STACK_ID, MODULE_ID,LEVEL) AS
( SELECT ROOT.STACK_ID, ROOT.MODULE_ID,1 LEVEL FROM software_stack_entry ROOT WHERE ROOT.MODULE_ID in
(select software_patch_id from software_patch) UNION ALL SELECT CHILD.STACK_ID, PARENT.MODULE_ID, LEVEL+1
FROM RPL PARENT, software_stack_entry CHILD WHERE PARENT.STACK_ID = CHILD.MODULE_ID AND LEVEL < 100)
select * from rpl