Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL中使用内部联接的递归CTE_Sql_Recursion_Join_Db2_Recursive Cte - Fatal编程技术网

在SQL中使用内部联接的递归CTE

在SQL中使用内部联接的递归CTE,sql,recursion,join,db2,recursive-cte,Sql,Recursion,Join,Db2,Recursive Cte,我必须做一个递归CTE,把所有认识kevin bacon的演员都还给我,为了更好地了解我的数据库我有Movies表和actors and Movies2Actors表,其中只包含actorid和movieid,我只需要通过两个演员找到认识bacon的人 例如,你可能想知道阿尔弗雷德·希区柯克是如何与凯文·培根联系在一起的。一个答案是: 阿尔弗雷德·希区柯克(Alfred Hitchcock)在1943年与奥森·威尔斯(Orson Welles)的战争中从事演艺事业 奥森·威尔斯1971年和杰克·

我必须做一个递归CTE,把所有认识kevin bacon的演员都还给我,为了更好地了解我的数据库我有Movies表和actors and Movies2Actors表,其中只包含actorid和movieid,我只需要通过两个演员找到认识bacon的人 例如,你可能想知道阿尔弗雷德·希区柯克是如何与凯文·培根联系在一起的。一个答案是: 阿尔弗雷德·希区柯克(Alfred Hitchcock)在1943年与奥森·威尔斯(Orson Welles)的战争中从事演艺事业 奥森·威尔斯1971年和杰克·尼科尔森在一个安全的地方 杰克·尼科尔森和凯文·培根在1992年的《好男人》里演过! 我正在尝试两种不同的方法,一种是给我一个空集,另一种是给我这个错误消息“递归通用表表达式的完整选择” 局长。培根必须是两个或多个完整节点的联合链接 并且不得包含列函数、子句GROUP BY和 or ORDER BY仍然包含带有ON子句的显式联接。'

WITH bacon (actorid, bacon_number) AS (
SELECT UNIQUE actorid, 0 FROM movies2actors 
        WHERE actorid =  (SELECT actorid FROM actors WHERE name = 'Bacon, Kevin (I)') UNION ALL
SELECT movies2actors.actorid, bacon.bacon_number + 1
FROM movies2actors, bacon 
       WHERE movies2actors.actorid IN 
            (SELECT UNIQUE actorid FROM movies2actors WHERE movieid IN (SELECT UNIQUE movieid FROM movies2actors 
                WHERE actorid = (SELECT actorid FROM actors WHERE name = 'Bacon, Kevin (I)') )) 
            AND movies2actors.actorid <> (SELECT actorid FROM actors WHERE name = 'Bacon, Kevin (I)') AND bacon.bacon_number<2  
)
SELECT bacon.actorid , bacon.bacon_number  FROM bacon ;

WITH bacon (actorid,relationid, bacon_number) AS (
SELECT UNIQUE actorid, actorid ,0 FROM ACTORS 
        WHERE name = 'Bacon, Kevin (I)'
UNION ALL
SELECT ACTORS.actorid,bacon.relationid, bacon.bacon_number + 1
FROM ACTORS
       JOIN  bacon ON ACTORS.actorid = bacon.relationid
       WHERE ACTORS.actorid IN 
            (SELECT UNIQUE actorid FROM movies2actors WHERE movieid IN (SELECT UNIQUE movieid FROM movies2actors 
                WHERE actorid = (SELECT actorid FROM actors WHERE name = 'Bacon, Kevin (I)') )) 
            AND ACTORS.actorid <> (SELECT actorid FROM actors WHERE name = 'Bacon, Kevin (I)') AND bacon.bacon_number<2     
)
SELECT bacon.actorid , bacon.bacon_number  FROM bacon ;

在DB2LUW中的递归CTE中使用旧的联接语法

table a,
table b
Where a.col = b.col 
试试这个:

/*
WITH 
  Movies (movieid, moviename) AS 
(
 VALUES
   (1, 'Show Business at War (1943)')
 , (2, 'A Safe Place (1971)')
 , (3, 'A Few Good Men (1992)')
)
, Actors (actorid, actorname) AS 
 (
 VALUES
   (1, 'Alfred Hitchcock')
 , (2, 'Orson Welles')
 , (3, 'Jack Nicholson')
 , (4, 'Kevin Bacon')
 )
 , Movies2Actors (movieid, actorid) AS
 (
 VALUES
  (1, 1)
, (1, 2)   
, (2, 2)   
, (2, 3)   
, (3, 3)
, (3, 4)
 )
, 
*/
bacon (actorid, level, chain) AS
(
SELECT mo.actorid, 1, cast('|'||trim(a.actorid)||'|'||trim(mo.actorid)||'|' AS varchar(1000))
FROM Actors a, Movies2Actors mb, Movies2Actors mo
WHERE a.actorname=
'Kevin Bacon' 
--'Jack Nicholson'
--'Orson Welles'
AND a.actorid=mb.actorid AND mb.movieid=mo.movieid
AND a.actorid<>mo.actorid 
  UNION ALL
SELECT mo.actorid, b.level+1, b.chain||trim(mo.actorid)||'|'
FROM bacon b, Movies2Actors mb, Movies2Actors mo
WHERE b.actorid=mb.actorid AND mb.movieid=mo.movieid
AND locate('|'||trim(mo.actorid)||'|', b.chain)=0 
)
SELECT DISTINCT a.actorname
--, b.*
FROM bacon b
JOIN Actors a ON a.actorid=b.actorid;
您可以使用示例数据取消注释注释掉的块,并按原样运行语句以检查结果。 链列用于防止递归