Select From CTE using AS? SQL Server 2008

11,131

Solution 1

The CTE declaration needs to go at the top. You can also have multiple CTEs declared and joined by commas rather than mixing CTEs and derived tables.

Try

;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

Solution 2

Move your CTE definition to the beginning of your SQL statement. The keyword WITH appears once at the beginning of your statement to introduce one or more CTEs, which may then be referred to in the following SQL. Take a look at this CTE example, it will clear it up for you.

Share:
11,131
Burak F. Kilicaslan
Author by

Burak F. Kilicaslan

Advanced Web Solutions, Software Development, Graphic Designs, Web Designs, Marketing, Import, Export, Internation Trade, E-Trade, E-Commerce Solutions, French Translation

Updated on June 15, 2022

Comments

  • Burak F. Kilicaslan
    Burak F. Kilicaslan almost 2 years

    I'm trying to convert a PostgreSQL into SQL Server. But this query doesn't work.

    What am I doing wrong? I tried to add a semicolon before WITH but no luck.

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

    Error I get:

    Msg 156, Level 15, State 1, Line 11
    Incorrect syntax near the keyword 'WITH'.
    Msg 319, Level 15, State 1, Line 11
    Incorrect syntax near the keyword 'with'. If this statement is a common table expression, an xmlnamespaces clause or a change tracking context clause, the previous statement must be terminated with a semicolon.
    Msg 102, Level 15, State 1, Line 34
    Incorrect syntax near ')'.

    Here is the reference; Graphs in the Database - SQL Meets Social Networks - Look at the facebook suggestion part at the bottom of the article.

    Thanks in advance

  • Burak F. Kilicaslan
    Burak F. Kilicaslan almost 13 years
    thank you @Martin working like a charm now and @Michael Ludwig: thanks for the reference it helped me a lot.