Необходимо преобразовать запрос DB2 в TSQL - PullRequest
0 голосов
/ 29 марта 2012

Я пытаюсь проверить первый ответ на этот вопрос:

SQL - схема сообщения - необходимо найти существующую ветку сообщений с учетом набора пользователей

Первый ответ на этот вопрос написан на DB2, и мне трудно преобразовать ответ в TSQL. Может ли кто-нибудь помочь мне понять это? Вот запрос:

WITH Selected_Users(id) as (VALUES (@id1), (@id2), --etc--),
     Threads(id) as (SELECT DISTINCT threadFk
                     FROM ThreadMembers as a
                     JOIN Selected_Users as b
                     ON b.id = a.userFk)
SELECT a.id
FROM Threads as a
WHERE NOT EXISTS (SELECT '1'
                  FROM ThreadMembers as b
                  LEFT JOIN Selected_Users as c
                  ON c.id = b.userFk
                  WHERE c.id IS NULL
                  AND b.threadFk = a.id)
AND NOT EXISTS (SELECT '1'
                FROM Selected_Users as b
                LEFT JOIN ThreadMembers as c
                ON c.userFk = b.id
                AND c.threadFk = a.id
                WHERE c.userFk IS NULL) 

Описание запроса является частью ответа, что очень помогает. Первая часть запроса создает временную таблицу с именем Selected_Users, но я не уверен, как это будет сделано. Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 29 марта 2012

Я не думаю, что T-SQL допускает синтаксис списка, который делает DB2. Как отмечает Андрей М, SQL 2008+ допускает довольно похожий синтаксис:

WITH Selected_Users(id) AS (
     SELECT Id FROM (
        VALUES (@id1), (@id2), --etc--
     ) AS V(Id)
),
....

Или вы можете создать реальную временную таблицу (или переменную):

DECLARE @selected_Users TABLE (id int);
INSERT @selected_Users VALUES 
 (@id1),
 (@id2),
 --etc.--
 ; --make sure to close with semi-colon before WITH CTE

и затем замените Selected_Users на @selected_Users в оставшейся части запроса. Или измените начальный CTE на:

WITH Selected_Users(id) AS (
    SELECT * FROM @selected_Users
),
....

Или вы можете сделать UNION ALL:

WITH Selected_Users(id) AS (
   SELECT @id1
   UNION ALL SELECT @id2 
   UNION ALL SELECT @id3
   --etc.--
),
....
1 голос
/ 29 марта 2012

Я незнаком с DB2, но если временные таблицы Selected_Users и Threads должны быть CTE (обычные табличные выражения - в основном, inline-views), то вам придется изменить их на:

WITH Selected_Users(id) AS
(
    SELECT @id1 UNION
    SELECT @id2
), 
Threads(id) AS
(
    SELECT DISTINCT
        threadFk
    FROM
        ThreadMembers a
    JOIN
        Selected_Users b
        ON
        a.userFk = b.id
 )
 SELECT 
     a.Id
 FROM
     Threads a
 WHERE
 ...

Я подумаю об отдыхе и скоро обновлю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...