簡體   English   中英

SHORTEST_PATH 在某些圖表中具有多個節點和一條邊

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

我有三張表來設計演員在電影(電影)中付費:

-- 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

我想知道如何編寫一個圖形查詢來找到加里格蘭特和詹姆斯梅森之間最短的社交距離......

我嘗試過的每個查詢都不起作用...

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'

結果是 3 個異常:

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

別名或標識符“acteurN.ACT_PRENOM”不能用於 select 列表、排序依據、分組依據或具有上下文。

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

別名或標識符“acteurN.ACT_NOM”不能用於 select 列表、排序依據、分組依據或具有上下文。

這些是相對於最后兩行或子查詢...

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

無法綁定多部分標識符“Q.LastNode”。

我為子查詢嘗試了另一種方法:

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'

但同樣的兩個例外(別名或標識符...不能在 select 列表中使用...)

這是我的測試集:

-- 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é');

這與阿爾弗雷德希區柯克的主要電影有關...

@lptr 給出的答案很好!

我只是簡化為:

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';

這給了我這樣的答案:

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