Выбрать из CTE, используя AS? SQL Server 2008 - PullRequest
6 голосов
/ 02 мая 2011

Я пытаюсь преобразовать PostgreSQL в SQL Server.Но этот запрос не работает.

Что я делаю не так?Я пытался добавить точку с запятой перед 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
Неверный синтаксисоколо ключевого слова «WITH».
Msg 319, уровень 15, состояние 1, строка 11
Неверный синтаксис рядом с ключевым словом «with».Если этот оператор является общим табличным выражением, предложением xmlnamespaces или предложением контекста отслеживания изменений, предыдущий оператор должен заканчиваться точкой с запятой.
Сообщение 102, Уровень 15, Состояние 1, Строка 34
Неверный синтаксис рядом с ') '.

Вот ссылка; Графики в базе данных - SQL встречается с социальными сетями - Взгляните на часть с предложением facebook в нижней части статьи.

Заранее спасибо

Ответы [ 2 ]

6 голосов
/ 02 мая 2011

Декларация 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
2 голосов
/ 02 мая 2011

Переместите определение CTE в начало вашего оператора SQL.Ключевое слово WITH появляется один раз в начале вашего оператора, чтобы ввести один или несколько CTE, на которые затем можно ссылаться в следующем SQL.Взгляните на этот пример CTE , он прояснит его для вас.

...