简体   繁体   English

SHORTEST_PATH 在某些图表中具有多个节点和一条边

[英]SHORTEST_PATH with several nodes and one edge in some graph tables

I have three tables to design actors paying in movies (films):我有三张表来设计演员在电影(电影)中付费:

-- actors node table :
CREATE TABLE T_ACTEUR_ACT
(ACT_ID        INT PRIMARY KEY,
 ACT_PRENOM    VARCHAR(32),
 ACT_NOM       VARCHAR(50)) AS NODE;

-- movies node table (films)
CREATE TABLE T_FILM_FLM
(FLM_ID        INT PRIMARY KEY,
 FLM_TITRE     VARCHAR(250),
 FLM_ANNEE     SMALLINT) AS NODE;

-- playing edge
CREATE TABLE T_JOUE_JOU (JOU_INTERPRETE VARCHAR(250)) AS EDGE;
GO

I would like to know how to write a Graph Query to find the shortest social distance between Cary Grant and James Mason...我想知道如何编写一个图形查询来找到加里格兰特和詹姆斯梅森之间最短的社交距离......

Every queries I have tried does not work...我尝试过的每个查询都不起作用...

SELECT ACTOR, chemin, Q.LastNode AS FRIEND
FROM
(
SELECT acteur0.ACT_PRENOM + acteur0.ACT_NOM AS ACTOR, 
         STRING_AGG(CONCAT(acteurN.ACT_PRENOM, ' ', acteurN.ACT_NOM), '->') 
          WITHIN GROUP (GRAPH PATH) AS chemin,
         LAST_VALUE(CONCAT(acteurN.ACT_PRENOM, ' ', acteurN.ACT_NOM)) 
          WITHIN GROUP (GRAPH PATH) AS LastNode
FROM   T_ACTEUR_ACT AS acteur0,
         T_JOUE_JOU FOR PATH AS joue,
       T_FILM_FLM FOR PATH as film,
       T_JOUE_JOU FOR PATH AS joue2,
         T_ACTEUR_ACT FOR PATH AS acteurN
WHERE  MATCH(SHORTEST_PATH( acteur0 ( - (joue) -> film - (joue2) -> acteurN ) + ) )
  AND  acteur0.ACT_PRENOM = 'Cary' AND acteur0.ACT_NOM = 'Grant'
  AND  acteurN.ACT_PRENOM <> 'Cary' AND acteurN.ACT_NOM <> 'Grant'
) AS G
WHERE G.LastNode = 'James Mason'

The result is 3exceptions:结果是 3 个异常:

Msg 13961, Niveau 16, État 1...消息 13961, Niveau 16, État 1...

The alias or identifier 'acteurN.ACT_PRENOM' cannot be used in the select list, order by, group by, or having context.别名或标识符“acteurN.ACT_PRENOM”不能用于 select 列表、排序依据、分组依据或具有上下文。

Msg 13961, Niveau 16, État 1...消息 13961, Niveau 16, État 1...

The alias or identifier 'acteurN.ACT_NOM' cannot be used in the select list, order by, group by, or having context.别名或标识符“acteurN.ACT_NOM”不能用于 select 列表、排序依据、分组依据或具有上下文。

Thoses are relative to the last two rows or the subquery...这些是相对于最后两行或子查询...

Msg 4104, Niveau 16, État 1, Ligne ... Msg 4104, Niveau 16, État 1, Ligne ...

The multi-part identifier "Q.LastNode" could not be bound.无法绑定多部分标识符“Q.LastNode”。

I have try another approach for the subquery:我为子查询尝试了另一种方法:

SELECT acteur0.ACT_PRENOM, acteur0.ACT_NOM, 
         STRING_AGG(CONCAT(acteurN.ACT_PRENOM, ' ', acteurN.ACT_NOM), '->') 
          WITHIN GROUP (GRAPH PATH) AS chemin,
         LAST_VALUE(CONCAT(acteurN.ACT_PRENOM, ' ', acteurN.ACT_NOM)) 
          WITHIN GROUP (GRAPH PATH) AS LastNode
FROM   T_ACTEUR_ACT AS acteur0,
         T_JOUE_JOU FOR PATH AS joue,
       T_FILM_FLM FOR PATH as film,
       T_JOUE_JOU FOR PATH AS joue2,
         T_ACTEUR_ACT FOR PATH AS acteurN
WHERE  MATCH(SHORTEST_PATH(acteur0 ( - (joue) -> film)+)
             AND 
             SHORTEST_PATH(LAST_NODE(film)(-(joue2) -> acteurN)+))
    AND acteur0.ACT_PRENOM = 'Cary' AND acteur0.ACT_NOM = 'Grant'
   AND acteurN.ACT_PRENOM <> 'Cary' AND acteurN.ACT_NOM <> 'Grant'

But the same two exceptions (The alias or identifier... cannot be used in the select list...)但同样的两个例外(别名或标识符...不能在 select 列表中使用...)

Here is my test set:这是我的测试集:

-- premier film

INSERT INTO T_FILM_FLM VALUES
(1, 'Rebecca', 1940);

INSERT INTO T_ACTEUR_ACT VALUES
(10001, 'Laurence', 'Olivier'),
(10002, 'Joan', 'Fontaine'),
(10003, 'Georges', 'Sanders');

INSERT INTO T_JOUE_JOU VALUES
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10001), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 1), 'George Fortescue Maximilien de Winter'),
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10002), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 1), 'Mrs de Winter'),
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10003), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 1), 'Jack Favell');
GO

-- second film

INSERT INTO T_FILM_FLM VALUES
(2, 'Correspondant 17', 1940);

INSERT INTO T_ACTEUR_ACT VALUES
(10004, 'Joel', 'McCrea'),
(10005, 'Laraine', 'Day'),
(10006, 'Herbert', 'Marshall');


INSERT INTO T_JOUE_JOU VALUES
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10004), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 2), 'John Jones / Huntley Haverstock'),
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10005), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 2), 'Carol Fisher'),
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10006), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 2), 'Stephen Fisher'),
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10003), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 2), 'Scott Ffolliott');
GO

-- 3e film

INSERT INTO T_FILM_FLM VALUES
(3, 'Soupçons', 1941);

INSERT INTO T_ACTEUR_ACT VALUES
(10007, 'Cary', 'Grant'),
(10014, 'Leo', 'G. Caroll');

INSERT INTO T_JOUE_JOU VALUES
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10002), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 3), 'Lina McLaidlaw Aysgarth'),
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10007), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 3), 'Johnnie Aysgarth'),
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10014), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 3), 'capitaine George Melbeck')
;


-- 4e film

INSERT INTO T_FILM_FLM VALUES
(4, 'L''Ombre d''un doute', 1943);

INSERT INTO T_ACTEUR_ACT VALUES
(10008, 'Joseph', 'Cotten'),
(10017, 'Teresa', 'Wright');

INSERT INTO T_JOUE_JOU VALUES
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10008), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 4), 'Charlie Oakley'),
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10017), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 4), 'Charlotte Newton');

-- 5e film

INSERT INTO T_FILM_FLM VALUES
(5, 'La Maison du docteur Edwardes', 1945);

INSERT INTO T_ACTEUR_ACT VALUES
(10009, 'Gregory', 'Peck'),
(10010, 'Ingrid', 'Bergman');

INSERT INTO T_JOUE_JOU VALUES
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10009), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 5), 'John Ballantine / Dr Anthony Edwardes / John Brown'),
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10010), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 5), 'Dr Constance Petersen'),
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10014), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 5), 'Dr Murchinson');


-- 6e film

INSERT INTO T_FILM_FLM VALUES
(6, 'Les Enchaînés', 1946);

INSERT INTO T_ACTEUR_ACT VALUES
(10018, 'Claude', 'Rains');

INSERT INTO T_JOUE_JOU VALUES
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10007), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 6), 'T.R. Devlin'),
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10010), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 6), 'Alicia Huberman'),
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10018), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 6), 'Alexander Sebastian');


-- 7e film

INSERT INTO T_FILM_FLM VALUES
(7, 'Le Procès Paradine', 1947);

INSERT INTO T_ACTEUR_ACT VALUES
(10011, 'Charles', 'Laughton'),
(10019, 'Ann', 'Todd'),
(10020, 'Louis', 'Jourdan');

INSERT INTO T_JOUE_JOU VALUES
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10009), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 7), 'Anthony Keane'),
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10011), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 7), 'Lord Thomas Horfield (juge)'),
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10019), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 7), 'Gay Keane'),
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10020), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 7), 'André Latour'),
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10014), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 7), 'Sir Joseph');

-- 8e film

INSERT INTO T_FILM_FLM VALUES
(8, 'la Corde', 1948);

INSERT INTO T_ACTEUR_ACT VALUES
(10012, 'Farley', 'Granger'),
(10013, 'James', 'Stewart');

INSERT INTO T_JOUE_JOU VALUES
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10012), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 8), 'Philip Morgan'),
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10013), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 8), 'Rupert Cadell');


-- 9e film

INSERT INTO T_FILM_FLM VALUES
(9, 'Les Amants du Capricorne', 1949);

INSERT INTO T_JOUE_JOU VALUES
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10008), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 9), 'Sam Flusky'),
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10010), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 9), 'Henrietta Flusky');

-- 10e film

INSERT INTO T_FILM_FLM VALUES
(10, 'L''Inconnu du Nord-Express', 1951);

INSERT INTO T_ACTEUR_ACT VALUES
(10021, 'Ruth', 'Roman'),
(10022, 'Robert', 'Walker'),
(10023, 'Patricia', 'Hitchcock');

INSERT INTO T_JOUE_JOU VALUES
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10012), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 10), 'Guy Haines'),
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10014), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 10), 'sénateur Morton'),
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10021), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 10), 'Anne Morton'),
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10022), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 10), 'Bruno Antony'),
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10023), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 10), 'Barbara Morton');


-- 11e film

INSERT INTO T_FILM_FLM VALUES
(11, 'Le crime était presque parfait', 1954);

INSERT INTO T_ACTEUR_ACT VALUES
(10015, 'Ray', 'Milland'),
(10016, 'Grace', 'Kelly'),
(10024, 'Robert', 'Cummings'),
(10025, 'John', 'Williams');
;

INSERT INTO T_JOUE_JOU VALUES
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10015), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 11), 'Tony Wendice'),
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10016), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 11), 'Margot Wendice'),
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10024), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 11), 'Mark Halliday'),
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10025), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 11), 'inspecteur Hubbard');

-- 12e film

INSERT INTO T_FILM_FLM VALUES
(12, 'Fenêtre sur cour', 1954);

INSERT INTO T_ACTEUR_ACT VALUES
(10026, 'Raymond', 'Burr');

INSERT INTO T_JOUE_JOU VALUES
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10013), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 12), 'Jeff Jefferies'),
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10016), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 12), 'Lisa Carol Fremont'),
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10026), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 12), 'Lars Thorwald');

-- 13e film

INSERT INTO T_FILM_FLM VALUES
(13, 'La Main au collet', 1955);

INSERT INTO T_ACTEUR_ACT VALUES
(10027, 'Charles', 'Vanel'),
(10028, 'Brigitte', 'Auber'),
(10029, 'Jessie', 'Royce Landis');


INSERT INTO T_JOUE_JOU VALUES
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10007), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 13), 'Georges Robert dit « le Chat » (John Robie dans la version originale)'),
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10016), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 13), 'Frances Stevens'),
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10027), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 13), 'Bertani'),
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10028), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 13), 'Danielle Foussard'),
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10029), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 13), 'Jessie Stevens'),
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10025), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 13), 'H. H. Hughson');

-- 14e film

INSERT INTO T_FILM_FLM VALUES
(14, 'L''Homme qui en savait trop', 1956);

INSERT INTO T_ACTEUR_ACT VALUES
(10030, 'Doris', 'Day'),
(10031, 'Daniel', 'Gélin');

INSERT INTO T_JOUE_JOU VALUES
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10007), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 14), 'docteur Ben McKenna'),
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10030), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 14), 'Dorothée McKenna'),
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10031), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 14), 'Louis Bernard');

-- 15e film

INSERT INTO T_FILM_FLM VALUES
(15, 'Sueurs froides', 1959);

INSERT INTO T_ACTEUR_ACT VALUES
(10032, 'Kim', 'Novak');

INSERT INTO T_JOUE_JOU VALUES
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10013), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 15), 'John Ferguson'),
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10032), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 15), 'Madeleine Elster / Judy Barton');

-- 16e film

INSERT INTO T_FILM_FLM VALUES
(16, 'La Mort aux trousses', 1959);

INSERT INTO T_ACTEUR_ACT VALUES
(10033, 'Eva Marie', 'Saint'),
(10034, 'James', 'Mason'),
(10035, 'Martin', 'Landau');;

INSERT INTO T_JOUE_JOU VALUES
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10007), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 16), 'Roger Thornhill'),
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10033), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 16), 'Eve Kendall'),
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10034), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 16), 'Philip Vandamm'),
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10035), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 16), 'Leonard'),
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10029), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 16), 'Clara Thornhill'),
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10014), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 16), 'le professeur');


-- 17e film

INSERT INTO T_FILM_FLM VALUES
(17, 'Psychose', 1960);

INSERT INTO T_ACTEUR_ACT VALUES
(10036, 'Antony', 'Perkins'),
(10037, 'Janet', 'Leigh');

INSERT INTO T_JOUE_JOU VALUES
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10036), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 17), 'Norman Bates'),
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10037), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 17), 'Marion Crane'),
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10023), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 17), 'Caroline (la secrétaire)');

-- 18e film

INSERT INTO T_FILM_FLM VALUES
(18, 'Les oiseaux', 1963);

INSERT INTO T_ACTEUR_ACT VALUES
(10038, 'Rod', 'Taylor'),
(10039, 'Tippi', 'Hedren');

INSERT INTO T_JOUE_JOU VALUES
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10038), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 18), 'Mitch Brenner'),
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10039), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 18), 'Melanie Daniels');


-- 19e film

INSERT INTO T_FILM_FLM VALUES
(19, 'Pas de printemps pour Marnie', 1964);

INSERT INTO T_ACTEUR_ACT VALUES
(10040, 'Sean', 'Connery');

INSERT INTO T_JOUE_JOU VALUES
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10038), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 19), 'Mark Rutland'),
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10039), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 19), 'Marnie Edgar / Margaret Edgar / Peggy Nicholson / Mary Taylor / Marion Holland');

-- 20e film

INSERT INTO T_FILM_FLM VALUES
(20, 'Le rideau déchiré', 1966);

INSERT INTO T_ACTEUR_ACT VALUES
(10041, 'Paul', 'Newman'),
(10042, 'Julie', 'Andrews');

INSERT INTO T_JOUE_JOU VALUES
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10041), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 20), 'professeur Michael Armstrong'),
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10042), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 20), 'docteur Sarah Louise Sherman');

-- 21e film
INSERT INTO T_FILM_FLM VALUES
(21, 'L''étau', 1969);

INSERT INTO T_ACTEUR_ACT VALUES
(10043, 'Frédérick', 'Stafford'),
(10044, 'Dany', 'Robin'),
(10045, 'Claude', 'Jade'),
(10046, 'Michel', 'Piccoli'),
(10047, 'Philippe', 'Noiret');

INSERT INTO T_JOUE_JOU VALUES
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10043), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 21), 'André Devereaux'),
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10044), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 21), 'Nicole Devereaux'),
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10045), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 21), 'Michèle Picard'),
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10046), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 21), 'Jacques Granville'),
((SELECT $node_id FROM T_ACTEUR_ACT WHERE ACT_ID = 10047), (SELECT $node_id FROM T_FILM_FLM WHERE FLM_ID = 21), 'Henri Jarré');

Which is relative to alfred Hitchcock's main films...这与阿尔弗雷德希区柯克的主要电影有关...

The answer given by @lptr is good ! @lptr 给出的答案很好!

I just simplify as:我只是简化为:

WITH
T_SEARCH_PATH AS
(
SELECT acteur0.ACT_PRENOM + ' '+ acteur0.ACT_NOM AS ACTOR, 
       STRING_AGG(CONCAT(acteurN.ACT_PRENOM, ' ', acteurN.ACT_NOM, ' : ', film.FLM_TITRE), ' -> ') 
          WITHIN GROUP (GRAPH PATH) AS path_to,
       LAST_VALUE(CONCAT(acteurN.ACT_PRENOM, ' ', acteurN.ACT_NOM)) 
          WITHIN GROUP (GRAPH PATH) AS LastNode
FROM   T_ACTEUR_ACT AS acteur0,
       T_JOUE_JOU FOR PATH AS joue,
       T_FILM_FLM FOR PATH as film,
       T_JOUE_JOU FOR PATH AS joue2,
       T_ACTEUR_ACT FOR PATH AS acteurN
WHERE  MATCH(SHORTEST_PATH( acteur0 ( - (joue) -> film - (joue2) -> acteurN ) + ) )
  AND  acteur0.ACT_PRENOM = 'Cary' AND acteur0.ACT_NOM = 'Grant'
)
SELECT ACTOR, path_to, LastNode AS FRIEND
FROM   T_SEARCH_PATH
WHERE  LastNode = 'Gregory Peck';

Which give me an answer like:这给了我这样的答案:

ACTOR        path_to                                                                          FRIEND
------------ -------------------------------------------------------------------------------- --------------
Cary Grant   Ingrid Bergman : Les Enchaînés -> Gregory Peck : La Maison du docteur Edwardes   Gregory Peck

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM