2011-05-01 41 views
6

我想将PostgreSQL转换为SQL Server。但是这个查询不起作用。从CTE中选择使用AS? SQL Server 2008

我在做什么错?我试图在WITH之前添加一个分号,但没有运气。

SELECT 
     member_a AS you, member_b AS mightknow, shared_connection, 
     CASE 
     WHEN (n1.member_job_country = n2.member_job_country AND n1.member_job_country = n3.member_job_country) THEN 'country in common' 
     WHEN (n1.member_unvan_id = n2.member_unvan_id AND n1.member_unvan_id = n3.member_unvan_id) THEN 'unvan in common' 
     ELSE 'nothing in common' 
     END AS reason 
    FROM (
     WITH transitive_closure(member_a, member_b, distance, path_string, direct_connection) AS 
     (SELECT 
      member_a, member_b, 1 AS distance, 
      CAST(member_a as varchar(MAX)) + '.' + CAST(member_b as varchar(MAX)) + '.' AS path_string, 
      member_b AS direct_connection 
     FROM Member_Contact_Edges 
     WHERE member_a = 45046 -- set the starting node 

     UNION ALL 

     SELECT 
      tc.member_a, e.member_b, tc.distance + 1, 
      CAST(tc.path_string as varchar(MAX)) + CAST(e.member_b as varchar(MAX)) + '.' AS path_string, 
      tc.direct_connection 
     FROM Member_Contact_Edges AS e 
     JOIN transitive_closure AS tc ON e.member_a = tc.member_b 
     WHERE tc.path_string NOT LIKE '%' + CAST(e.member_b as varchar(MAX)) + '.%' 
     AND tc.distance < 2 
     ) 

    SELECT 
     member_a, member_b,direct_connection AS shared_connection 
    FROM transitive_closure 
    WHERE distance = 2 
) AS youmightknow 
    LEFT JOIN Members AS n1 ON youmightknow.member_a = n1.memberID 
    LEFT JOIN Members AS n2 ON youmightknow.member_b = n2.memberID 
    LEFT JOIN Members AS n3 ON youmightknow.shared_connection = n3.memberID 
    WHERE (n1.member_job_country = n2.member_job_country 
     AND n1.member_job_country = n3.member_job_country) 
     OR (n1.member_unvan_id = n2.member_unvan_id 
      AND n1.member_unvan_id = n3.member_unvan_id); 

错误,我得到:

消息156,级别15,状态1,行 '与' 关键字11
附近有语法错误。
Msg 319,Level 15,State 1,Line 11
关键字'with'附近的语法不正确。如果此语句是 公用表表达式, xmlnamespaces子句或 跟踪上下文子句,则前面的 语句必须以 分号结尾。
Msg 102,Level 15,State 1,Line 34
')'附近的语法不正确。

这里是参考; Graphs in the Database - SQL Meets Social Networks - 看文章底部的facebook建议部分。

在此先感谢

回答

6

CTE声明需要在顶部。您也可以使用逗号声明和加入多个CTE,而不是混合CTE和派生表。

尝试

;WITH 
/*First CTE declaration*/ 
transitive_closure(member_a, member_b, distance, path_string, direct_connection) 
AS 
( 
    ... 
), 
/*Second CTE declaration*/ 
youmightknow AS 
(
SELECT member_a, member_b,direct_connection AS shared_connection 
FROM transitive_closure 
WHERE distance = 2 
)   
SELECT member_a AS you, 
... 
FROM youmightknow 
+0

谢谢@Martin现在像一个魅力工作和@迈克尔路德维希:谢谢你的参考,它帮助了我很多。 – 2011-05-01 22:16:33

2

移动你的CTE定义你的SQL语句的开始。关键字WITH在您的语句开头出现一次,以引入一个或多个CTE,这些CTE可能会在以下SQL中引用。看看这个CTE example,它会为你清除它。